Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
#1

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

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

Всем привет.

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

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

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

Если у кого-то есть интересные мысли, обязательно делитесь.

http://www.cyberforum.ru/cpp-beginners/thread1043126.html

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

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

Указатель после освобождения памяти
Стивен Прата, глава 4, раздел "Освобождение памяти с помощью операции delete" ...

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

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

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

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

В Java и C# проще, там сборщик мусора.
0
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 11:14  [ТС] #7
SherHun, спасибо...Тоже стоит попробовать разобраться. Хотя на первый взгляд выглядит очень непривычно.
0
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
08.09.2015, 11:43 #8
Лучший ответ Сообщение было отмечено sion5 как решение

Решение

sion5,
можно "перегрузить" new/delete использовав макросы. Смотреть в книге Thinking in C++ Volume 2 (by Bruce Eckel) секцию Finding Memory Leaks. Вот на английском:
http://web.mit.edu/merolish/ticpp/TicV2.html#_Toc53985653
1
Kastaneda
Jesus loves me
Эксперт С++
4759 / 2962 / 340
Регистрация: 12.12.2009
Сообщений: 7,520
Записей в блоге: 2
Завершенные тесты: 1
08.09.2015, 12:00 #9
плюс к valgrind - в gcc/clang есть поддержка memory sanitizer, работает раз в 100 быстрее, чем valgrind.
0
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 12:26  [ТС] #10
Да, понял про перегрузку new. Спасибо
До подмены new я уже додумался, но боялся, что придется менять в коде оператор new на какой-то макрос или на оператор с другим именем и синтаксисом. Оказывается, не нужно.

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

Не по теме:

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

0
SherHun
08.09.2015, 13:45
  #12

Не по теме:


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

0
gazlan
3139 / 1915 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
08.09.2015, 14:00 #13
Цитата Сообщение от sion5 Посмотреть сообщение
windows!
В MFC все уже перегружено "из коробки" + полно сторонних решений (например, поищите на codeproject) + (выбор редакции) BoundsChecker.
0
Миниатюры
Проверка освобождения памяти (new, delete)  
AlexVRud
477 / 189 / 72
Регистрация: 04.07.2014
Сообщений: 529
08.09.2015, 14:14 #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;
}
0
sion5
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
08.09.2015, 15:24  [ТС] #15
Мне не нужно удалять что-либо автоматически. Мне нужно проверить, не упустил ли я что-то, когда писал деструкторы.
И с тем, что читать прямо сейчас, я сам разберусь без чьих-либо команд...
На самом деле, я вообще не очень поклонник высокоуровневых библиотек. Пусть даже стандартных...

Наверное, надо было с самого начала сказать, что у меня windows и mingw...
В любом случае, это всё уже не важно. Пока что я вполне счастлив с перегруженным new...
0
Croessmah
++Ͻ
14149 / 8074 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
08.09.2015, 15:39 #16
Мне нужно проверить, не упустил ли я что-то, когда писал деструкторы.
Тогда не помешает еще "стресс-тест" устроить
1
AlexVRud
477 / 189 / 72
Регистрация: 04.07.2014
Сообщений: 529
08.09.2015, 16:42 #17
sion5, В том и дело, что людям надоело постоянно расписывать конструкторы, деструкторы, операторы присваивания, копирования и т.д. Использование умных указателей сокращает код и делает его более безопасным (хотя и выглядят длинные строки объявления ужасающими, но обрати внимание, что деструкторы в приведённом коде, по сути излишни, а new/delete в коде нет). Поэтому и ввели умные указатели в стандарт 2011 года (и не только их). А g++ в MinGW точно также поддерживает ключ -std=C++11.
0
Avazart
08.09.2015, 16:46
  #18

Не по теме:

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

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

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

Переполнение стека во время освобождения памяти
Здравствуйте! СТолкнулся с такой проблемой, что при работе деструктора...

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

Необходим совет при освобождения памяти динамического массива
Имеется код: -создание трехмерного динамического массива float ***Kadr;...


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

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

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