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

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

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

Проверка освобождения памяти (new, delete) - C++

08.09.2015, 10:13. Просмотров 922. Ответов 23
Метки нет (Все метки)

Всем привет.

Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри других самодельных контейнеров внутри каких-то child объектов... И это всё должно красиво и чисто удалиться, когда удаляется parent.
И хотя мне кажется, что я правильно прописал все деструкторы, не помешала бы возможность проверить.

Что бы такое вставить перед самым return из функции main, чтоб убедиться, что освобождена вся память?
Может, кто-то вспомнит какой-то способ получить информацию об участках памяти, которые выделялись?
Или, возможно, можно обойтись без изменения кода, а проверить в каком-то дебаггере? У меня есть OllyDbg.

Поначалу я добавлял что-то типа printf("Created %p\n", this) в конструктор и деструктор каждого класса, но это, конечно, бред новичка.
На данный момент лучшая идея - это по всей программе заменить new и delete на самодельные макросы, которые будут не толко создавать/удалять объект, а еще и сохранять информацию (адрес, размер, имя класса и строка кода, из которой объект был создан).
Но все-таки не хотелось бы так менять программу...

Если у кого-то есть интересные мысли, обязательно делитесь.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2015, 10:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка освобождения памяти (new, delete) (C++):

Ошибка освобождения памяти new/delete - C++
При выполнении оператора deleterez вылетает ошибка BLOCK_TYPE_IS_VALID(pHead->nBlockUse) #include <iostream> using namespace std;...

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

Указатель после освобождения памяти - C++
Стивен Прата, глава 4, раздел "Освобождение памяти с помощью операции delete" Я пытаюсь понять. Написал: #include <iostream> ...

Стратегия выделения/освобождения памяти - C++
здравствуйте господа. есть такой вопрос. пусть есть класс например Bitmap - несжатое растровое изображение. Пусть необходимо уметь...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13223 / 7495 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
08.09.2015, 15:39 #16
Мне нужно проверить, не упустил ли я что-то, когда писал деструкторы.
Тогда не помешает еще "стресс-тест" устроить
1
AlexVRud
442 / 152 / 38
Регистрация: 04.07.2014
Сообщений: 431
08.09.2015, 16:42 #17
sion5, В том и дело, что людям надоело постоянно расписывать конструкторы, деструкторы, операторы присваивания, копирования и т.д. Использование умных указателей сокращает код и делает его более безопасным (хотя и выглядят длинные строки объявления ужасающими, но обрати внимание, что деструкторы в приведённом коде, по сути излишни, а new/delete в коде нет). Поэтому и ввели умные указатели в стандарт 2011 года (и не только их). А g++ в MinGW точно также поддерживает ключ -std=C++11.
0
Avazart
08.09.2015, 16:46
  #18

Не по теме:

AlexVRud, Вы хотя бы вдумались бы что вам пишет ТС, ваши умные указатели не к селу не к городу.

0
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 17:09  [ТС] #19
Да нет, всё в порядке. Я рад любым мыслям, имеющим хоть какое-то отношение к решаемым в данный момент проблемам...
AlexVRud, мне пока не надоело всё расписывать Меня интересуют решения на самом низком возможном уровне. Потому что вот так вот начну со стандартных высокоуровневых библиотек, а потом докачусь до какого-нибудь Qt, на котором маленькое окошечко с кнопкой "Нажми меня!" требует библиотек общим весом 70 Мб и колд-старт секунд 5...
Ладно-ладно, я, конечно, тоже использую Qt Но сейчас хочу сделать для себя собственную библиотечку для создания GUI в windows, с которой маленькие программы весили бы столько, сколько положено маленьким программам. И хоть я и не собираюсь использовать boost, его исходники помогли реализовать красивую систему сигналов.
Ладненько, спасибо всем за внимание.
0
hoggy
Нарушитель
6584 / 2765 / 476
Регистрация: 15.11.2014
Сообщений: 6,109
Завершенные тесты: 1
08.09.2015, 19:49 #20
Цитата Сообщение от sion5 Посмотреть сообщение
Что бы такое вставить перед самым return из функции main, чтоб убедиться, что освобождена вся память?

for cl (visual studio)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define _CRTDBG_MAP_ALLOC
 
 
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
    #define _DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #define new _DEBUG_NEW
    #include <crtdbg.h>
#endif
 
int main()
{
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF|_CRTDBG_CHECK_ALWAYS_DF|_CRTDBG_DELAY_FREE_MEM_DF);
    _CrtSetReportMode(_CRT_WARN  , _CRTDBG_MODE_FILE   );
    _CrtSetReportFile(_CRT_WARN  , _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode(_CRT_ERROR , _CRTDBG_MODE_FILE   );
    _CrtSetReportFile(_CRT_ERROR , _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE   );
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT );
    
    int* p =new int(19);
}
2
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,666
Записей в блоге: 17
08.09.2015, 20:21 #21
Цитата Сообщение от sion5 Посмотреть сообщение
с которой маленькие программы весили бы столько, сколько положено маленьким программам.
Просто не пишите маленькие программы... и не будет таких глупых утверждений.

Цитата Сообщение от sion5 Посмотреть сообщение
требует библиотек общим весом 70 Мб и колд-старт секунд 5...
Обычно ~40...50M, если собирать статически ~7...10M

Цитата Сообщение от sion5 Посмотреть сообщение
Меня интересуют решения на самом низком возможном уровне.
Учите WinApi думаю ниже некуда, заодно осознаете насколько легче писать на Qt
0
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 21:15  [ТС] #22
Да, я как-раз и оборачиваю WinApi в более удобные (на мой взгляд) классы. Код программ выглядят почти как на Qt. Только система сигналов/слотов немного другая и Layout'ы я заменил кое-чем другим, но не менее функциональным...

Сейчас для меня главное - это не налажать именно с удалением... Виндосовские окна, когда их удаляешь, автоматически удаляют всех своих чайлдов, все меню, все пункты меню... А у меня каждый пункт меню и каждое чайлд окно обернуто в класс и создавалось с помощью new. То есть, мне не достаточно того, что windows удаляет что-то там у себя, а нужно еще и мои объекты удалять. Поначалу немного запутался, но теперь, вроде, всё работает просто и логично. Советы из этой темы помогут проверить.
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,666
Записей в блоге: 17
08.09.2015, 22:37 #23
Ну так что мешает создать базовый класс виджета с поддержкой родитель-ребенок, и его продумать/ и оттестить хорошо?
0
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 23:36  [ТС] #24
Я уже почти готов пожертвовать аккаунтом на данном форуме, чтоб сказать тебе всё, что я думаю о твоих советах и особенно о совете "не писать маленькие программы" :-D
Ладно, хватит...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2015, 23:36
Привет! Вот еще темы с ответами:

Нюансы выделения и освобождения памяти (структуры) - C++
struct point { int a; point *next; } point *p=new point Я освобожу всю память которая отводилась под динам. структуру? delete...

Переполнение стека во время освобождения памяти - C++
Здравствуйте! СТолкнулся с такой проблемой, что при работе деструктора программа аварийно завершается, а в дебаггере появляется сообщение о...

Использование __try __finaly для освобождения памяти - C++
Здравствуйте. Подскажите, как возможно использовать конструкцию __try, __finaly для освобождения ресурсов в одном месте. Пример: ...

Не могу разобраться с указателями(не понимаю сути освобождения памяти) - C++
Вот я тоже дуб в указателях... помогите пожалуйста кому не лениво... с горем пополам заработал Enter (ноуту пора в утиль), и вот (вопросы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.09.2015, 23:36
Ответ Создать тему
Опции темы

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