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

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

Восстановить пароль Регистрация
 
 
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 10:13     Проверка освобождения памяти (new, delete) #1
Всем привет.

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

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

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

Если у кого-то есть интересные мысли, обязательно делитесь.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
08.09.2015, 10:21     Проверка освобождения памяти (new, delete) #2
valgrind
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 10:42  [ТС]     Проверка освобождения памяти (new, delete) #3
windows!
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
08.09.2015, 10:47     Проверка освобождения памяти (new, delete) #4
https://msdn.microsoft.com/en-us/lib...(v=vs.90).aspx
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 11:03  [ТС]     Проверка освобождения памяти (new, delete) #5
Спасибо У меня mingw, но теперь я хоть знал, что гуглить, и нашел много полезного по запросу "gcc crtdbg".
SherHun
 Аватар для SherHun
29 / 29 / 15
Регистрация: 22.06.2015
Сообщений: 102
08.09.2015, 11:06     Проверка освобождения памяти (new, delete) #6
Цитата Сообщение от sion5 Посмотреть сообщение
На данный момент лучшая идея - это по всей программе заменить new и delete на самодельные макросы
Умные указатели ?

В Java и C# проще, там сборщик мусора.
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 11:14  [ТС]     Проверка освобождения памяти (new, delete) #7
SherHun, спасибо...Тоже стоит попробовать разобраться. Хотя на первый взгляд выглядит очень непривычно.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
08.09.2015, 11:43     Проверка освобождения памяти (new, delete) #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
sion5,
можно "перегрузить" new/delete использовав макросы. Смотреть в книге Thinking in C++ Volume 2 (by Bruce Eckel) секцию Finding Memory Leaks. Вот на английском:
http://web.mit.edu/merolish/ticpp/Ti...l#_Toc53985653
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.09.2015, 12:00     Проверка освобождения памяти (new, delete) #9
плюс к valgrind - в gcc/clang есть поддержка memory sanitizer, работает раз в 100 быстрее, чем valgrind.
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 12:26  [ТС]     Проверка освобождения памяти (new, delete) #10
Да, понял про перегрузку new. Спасибо
До подмены new я уже додумался, но боялся, что придется менять в коде оператор new на какой-то макрос или на оператор с другим именем и синтаксисом. Оказывается, не нужно.

Про умные указатели и memory sanitizer тоже обязательно почитаю для развития.
Avazart
08.09.2015, 12:43
  #11

Не по теме:

Цитата Сообщение от SherHun Посмотреть сообщение
В Java и C# проще, там сборщик мусора.
Память не единственный ресурс которым нужно "привыкать" управлять.
И умные указатели выглядят компактнее нежели блоки try/finally на мой взгляд.

SherHun
08.09.2015, 13:45
  #12

Не по теме:


To Avazart
Автор просил делиться мыслями. Когда у меня была возможность пойти Java программистом «с нуля», не пошел. Было свободное время и силы. Казалось, что программисты — это такие запуганные очкарики, которые боятся выйти на улицу и смотрят от безысходности целый день в монитор. ))
… Теперь, через много лет жалею. И Java стал чем-то таким недостижимым, тем что нельзя вернуть.
Возможно автору и нужно сделать правильный шаг. Язык выбрать правильный к примеру. …
Это всего лишь мысли …. Мне далеко и до Java и до умных указателей ….
Просил мыслей, я и предложил.

gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
08.09.2015, 14:00     Проверка освобождения памяти (new, delete) #13
Цитата Сообщение от sion5 Посмотреть сообщение
windows!
В MFC все уже перегружено "из коробки" + полно сторонних решений (например, поищите на codeproject) + (выбор редакции) BoundsChecker.
Миниатюры
Проверка освобождения памяти (new, delete)  
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
08.09.2015, 14:14     Проверка освобождения памяти (new, delete) #14
Цитата Сообщение от sion5 Посмотреть сообщение
Про умные указатели и memory sanitizer тоже обязательно почитаю для развития.
Про умные указатели ты читай прямо сейчас. Они для того и создавались, что бы удалять объекты автоматически.
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 <iostream>
#include <memory>
 
class Foo {
public:
    Foo() {
        std::cout << "Foo: constructor\n";
    };
    ~Foo() {
        std::cout << "Foo: destructor\n";
    };
};
 
class Bar {
public:
    Bar() : _foo(std::make_shared<Foo>())
    {
        std::cout << "Bar: default constructor\n";
    };
    Bar(std::shared_ptr<Foo> foo) : _foo(foo)
    {
        std::cout << "Bar: constructor(*Foo)\n";
    };
    ~Bar() {
        std::cout << "Bar: destructor\n";
    };
protected:
    std::shared_ptr<Foo> _foo;
};
 
 
int main() {
  std::shared_ptr<Bar> bar_1 = std::make_shared<Bar>();
 
  std::shared_ptr<Foo> foo_2 = std::make_shared<Foo>();
  std::shared_ptr<Bar> bar_2 = std::make_shared<Bar>(foo_2);
 
  return 0;
}
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 15:24  [ТС]     Проверка освобождения памяти (new, delete) #15
Мне не нужно удалять что-либо автоматически. Мне нужно проверить, не упустил ли я что-то, когда писал деструкторы.
И с тем, что читать прямо сейчас, я сам разберусь без чьих-либо команд...
На самом деле, я вообще не очень поклонник высокоуровневых библиотек. Пусть даже стандартных...

Наверное, надо было с самого начала сказать, что у меня windows и mingw...
В любом случае, это всё уже не важно. Пока что я вполне счастлив с перегруженным new...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
08.09.2015, 15:39     Проверка освобождения памяти (new, delete) #16
Мне нужно проверить, не упустил ли я что-то, когда писал деструкторы.
Тогда не помешает еще "стресс-тест" устроить
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
08.09.2015, 16:42     Проверка освобождения памяти (new, delete) #17
sion5, В том и дело, что людям надоело постоянно расписывать конструкторы, деструкторы, операторы присваивания, копирования и т.д. Использование умных указателей сокращает код и делает его более безопасным (хотя и выглядят длинные строки объявления ужасающими, но обрати внимание, что деструкторы в приведённом коде, по сути излишни, а new/delete в коде нет). Поэтому и ввели умные указатели в стандарт 2011 года (и не только их). А g++ в MinGW точно также поддерживает ключ -std=C++11.
Avazart
08.09.2015, 16:46
  #18

Не по теме:

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

sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 17:09  [ТС]     Проверка освобождения памяти (new, delete) #19
Да нет, всё в порядке. Я рад любым мыслям, имеющим хоть какое-то отношение к решаемым в данный момент проблемам...
AlexVRud, мне пока не надоело всё расписывать Меня интересуют решения на самом низком возможном уровне. Потому что вот так вот начну со стандартных высокоуровневых библиотек, а потом докачусь до какого-нибудь Qt, на котором маленькое окошечко с кнопкой "Нажми меня!" требует библиотек общим весом 70 Мб и колд-старт секунд 5...
Ладно-ладно, я, конечно, тоже использую Qt Но сейчас хочу сделать для себя собственную библиотечку для создания GUI в windows, с которой маленькие программы весили бы столько, сколько положено маленьким программам. И хоть я и не собираюсь использовать boost, его исходники помогли реализовать красивую систему сигналов.
Ладненько, спасибо всем за внимание.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2015, 19:49     Проверка освобождения памяти (new, delete)
Еще ссылки по теме:

C++ Переполнение стека во время освобождения памяти
Стратегия выделения/освобождения памяти C++
Адреса памяти, в которых происходит выделение, и нет освобождения C++

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

Или воспользуйтесь поиском по форуму:
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,797
Завершенные тесты: 1
08.09.2015, 19:49     Проверка освобождения памяти (new, delete) #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);
}
Yandex
Объявления
08.09.2015, 19:49     Проверка освобождения памяти (new, delete)
Ответ Создать тему
Опции темы

Текущее время: 03:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru