Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tutu
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 2
#1

Утечка памяти. new/delete. Всё как доктор прописал, но не работает - C++

02.11.2013, 22:00. Просмотров 519. Ответов 3
Метки нет (Все метки)

Всем привет! Начну сразу с кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class A{
public:
    int mas[1000];
public:
    A(){}
    ~A(){}
};
 
class B{
public:
    A **a;
    B(){
        a=new A*[10];
        for(int i=0;i<10;i++)
            a[i]=new A[100];
    }
    ~B(){
        for(int i=0;i<10;i++)
            delete [] a[i];
        delete[] a;
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    B *b;
    _getch();
    for(int i=0; i<100;i++){
        b = new B();
        delete b;       
    }
    _getch();
    return 0;
}
Второй вариант класса B, но создается и удаляется одномерный массив объектов класса А
C++
1
2
3
4
5
6
7
8
9
10
class B{
public:
    A *a;
    B(){
        a=new A[1000];
    }
    ~B(){
        delete[] a;
    }
};
Проблема следующая. В первом варианте кода происходит утечка памяти. Если переделать класс B как указано во втором варианте, то всё работает как надо. Т.е. двумерный массив не работает, одномерный всё ок. Код носит просто тестовый характер и функциональности в нем только занимать память, т.к. в более серьезном проекте я наткнулся на эту проблему и создал отдельную программу, что бы попытаться решить проблему. Работа с памятью заметна и в обычном диспетчере задач Windows. Перекопал тьму форумов и везде один и тот же вариант реализации удаления динамического двумерного массива. Спасибо за помощь и успехов в программировании.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2013, 22:00     Утечка памяти. new/delete. Всё как доктор прописал, но не работает
Посмотрите здесь:

Delete[] и утечка памяти - C++
Как можно избежать вытока памяти? И вообще почкму криво работает? #include&lt;iostream&gt; #include&lt;windows.h&gt; #include&lt;ctime&gt; using...

Утечка памяти и delete - C++
Вот накопились вопросы про утечки памяти. 1) Как проявляется утечка памяти? На многих сайтах написано что если не удалять указатели то...

Утечка памяти. Как ее побороть? - C++
void Player::add() { Ship *bombers; bombers = new Bomber; for(int i=0; i&lt;num_bombers; i++) { Bomber temp(7, 40, 1, 1);...

Дерево. Утечка памяти, как обнаружить? - C++
Приветствую! Помогите найти ошибку в коде? Точнее ошибку знаю, строка : element-&gt;ojciec-&gt;tab_dzieci= element; Только не знаю...

Утечка памяти - C++
Не могу понять как избежать утечки памяти в своей программе... привожу кусок в одном из мест где на мой взгляд она происходит... Array...

Утечка памяти - C++
Здравствуйте. Есть программа (разбитая на функции) постоянно работающая в цикле и выводящая информацию на консоль. И получается что она...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
03.11.2013, 10:46     Утечка памяти. new/delete. Всё как доктор прописал, но не работает #2
А если так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class A{
public:
    int mas[1000];
public:
    A(){}
    ~A(){}
};
 
class B{
public:
    A **a;
    B(){
        a=new A*[10];
        for(int i=0;i<10;i++)
            a[i]=new A[100];
    }
    ~B(){
        for(int i=0;i<10;i++)
            delete [] a[i];
        delete[] a;
    }
};
 
int main(int argc, char* argv[])
{
 
    _getch();
    for(int i=0; i<100;i++){
       B *b = new B();
        delete b;
    }
    _getch();
    return 0;
}
Добавлено через 24 минуты
CppCheck говорит
"класса Б " не имеет конструктор копирования, который рекомендуется, поскольку этот класс содержит указатель на выделенную память

Член переменной " ::mas " не инициализируется в конструкторе.
MrGluck
Модератор
Эксперт CЭксперт С++
7178 / 4344 / 634
Регистрация: 29.11.2010
Сообщений: 11,822
03.11.2013, 10:52     Утечка памяти. new/delete. Всё как доктор прописал, но не работает #3
Цитата Сообщение от tutu Посмотреть сообщение
В первом варианте кода происходит утечка памяти.
В вашем коде с данным main утечек не вижу, есть лишь потенциальные. В классе не объявлен явно конструктор копий и оператор присвавивания.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 19:45     Утечка памяти. new/delete. Всё как доктор прописал, но не работает
Еще ссылки по теме:

Утечка памяти - C++
Привет! написал программму, и не могу разобраться где утекает память. помогите кто сможет. Задание #include &lt;iostream&gt; ...

Утечка памяти - C++
Доброго времени суток. Написал оконное приложение. Столкнулся с проблемой - утекает память. Какие есть средства, чтобы определить,...

утечка памяти - C++
если запустить код char *pointer = NULL; for( int i = 0; i &lt; 10; i++ ) { pointer = new char; } delete pointer; , то есть...

Утечка памяти - C++
Доброго времени суток, форумчане. Помогите справиться с утечкой памяти, не понятно где зараза засела. Это класс представления числа в СОК...

утечка памяти - C++
Может кто-то проверить есть ли здесь утечка памяти? Мне почему-то кажется что есть. В задачи нужно когда пользователь сделал операции...

Утечка памяти - C++
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор vector&lt;char*&gt; names_variable; дополняю его таким образом ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
tutu
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 2
03.11.2013, 19:45  [ТС]     Утечка памяти. new/delete. Всё как доктор прописал, но не работает #4
Спасибо всем за ответы, проблему решил. Я только сегодня заметил что тестовый пример отличается от проблемного проекта. Т.к. меня печалят темы на форумах где есть вопрос, проблема скорее всего решена, а автор не соизволил написать решение, поэтому напишу в чем была проблема. Может кому поможет.
В реальности, мой проект это курсовик по шахматам. В нём есть класс Board это доска, в нем есть класс клетки Cell (их [8][8]). Клетки у меня были через указатель, именно в этом и оказалась проблема.
В жизни это так:
C++
1
ChessCell ***Cell;
Как выделялась память под них:
C++
1
2
3
4
 
Cell = new ChessCell**[8]; //выделил строки:
for(int i=0;i<8;i++)//Потом столбцы:
   Cell[i] = new ChessCell*[8];
Потом я добавил уже указатели самих клеток поля:
C++
1
2
3
for(int i=0;i<8;i++)
   for(int j=0;j<8;j++)
      Cell[i][j]=new ChessCell();
Но возник вопрос - А как я это всё освобождаю:
Было так:
C++
1
2
3
for (int i = 0; i<8; i++)
    delete [] Cell[i];
delete [] Cell;
И вот возникла мысль "Блин! А где я освобождаю память от указателей на сами клетки?!!". А ответ - Нигде. Вот она и была утечка. Добавил пару циклов до тех что выше написаны:
C++
1
2
3
for (int i=0; i<8;i++)
  for(int j=0; j<8;j++)
     delete Cell[i][j];
И всё заработало как часы Так что, у кого динамический массив указателей и есть утечка памяти, смотрите нет ли у вас того же косяка что был у меня. Всем спасибо за помощь.
Yandex
Объявления
03.11.2013, 19:45     Утечка памяти. new/delete. Всё как доктор прописал, но не работает
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru