Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 2

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

02.11.2013, 22:00. Показов 1731. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2013, 22:00
Ответы с готовыми решениями:

Оператор delete[]. Как исправить ошибку: Error HEAP CORRUPTED. Откуда утечка памяти?
Код функции: void SeeAllTimesAllProcs() { HANDLE SnapHNDL = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32...

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

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

3
81 / 80 / 9
Регистрация: 30.10.2013
Сообщений: 251
03.11.2013, 10:46
А если так
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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
03.11.2013, 10:52
Цитата Сообщение от tutu Посмотреть сообщение
В первом варианте кода происходит утечка памяти.
В вашем коде с данным main утечек не вижу, есть лишь потенциальные. В классе не объявлен явно конструктор копий и оператор присвавивания.
1
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 2
03.11.2013, 19:45  [ТС]
Спасибо всем за ответы, проблему решил. Я только сегодня заметил что тестовый пример отличается от проблемного проекта. Т.к. меня печалят темы на форумах где есть вопрос, проблема скорее всего решена, а автор не соизволил написать решение, поэтому напишу в чем была проблема. Может кому поможет.
В реальности, мой проект это курсовик по шахматам. В нём есть класс 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2013, 19:45
Помогаю со студенческими работами здесь

Утечка памяти, правильное использование new/delete
Здравствуйте. Написал программку, где работаю с передачей контейнера QList методом сигналов и слотов. Теперь ищу где накосячил с утечкой...

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

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка ссылки с сайта и ищет там определенную...

Ноутбук не видит флэшку, как загрузочную. В Биосе все, как положено, прописал.
Мне надо с флэшки поработать с разделами жесткого диска. Как это сделать, учитывая, что Винды уже нет? Вот это не помогло. Ноутбук не видит...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru