Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

02.11.2013, 22:00. Просмотров 542. Ответов 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. Перекопал тьму форумов и везде один и тот же вариант реализации удаления динамического двумерного массива. Спасибо за помощь и успехов в программировании.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2013, 22:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Утечка памяти. new/delete. Всё как доктор прописал, но не работает (C++):

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

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

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

Утечка памяти. Как ее побороть? - 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++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class MyArray { int *ptrarray; //массив ...

3
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
03.11.2013, 10:46 #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 " не инициализируется в конструкторе.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7496 / 4611 / 694
Регистрация: 29.11.2010
Сообщений: 12,621
03.11.2013, 10:52 #3
Цитата Сообщение от tutu Посмотреть сообщение
В первом варианте кода происходит утечка памяти.
В вашем коде с данным main утечек не вижу, есть лишь потенциальные. В классе не объявлен явно конструктор копий и оператор присвавивания.
1
tutu
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 2
03.11.2013, 19:45  [ТС] #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];
И всё заработало как часы Так что, у кого динамический массив указателей и есть утечка памяти, смотрите нет ли у вас того же косяка что был у меня. Всем спасибо за помощь.
0
03.11.2013, 19:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 19:45
Привет! Вот еще темы с ответами:

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

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

Утечка памяти - C++
Здравствуйте! Я пишу длинную арифметику для целых чисел. Ниже - функция произведения чисел X и Y. Вопрос: произойдет ли утечка памяти, и...

Утечка памяти - C++
Господа подскажите как узнать какая п̶а̶д̶л̶а̶ переменная жрет память? Или как посмотреть сколько вообще переменных и объектов находятся в...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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