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

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

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

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

08.09.2015, 10:13. Просмотров 1045. Ответов 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++
Необходим написать функции выделения и освобождения памяти под двумерный динамический массив. Причем освобождение должн быть не сразу для...

23
Voivoid
675 / 278 / 12
Регистрация: 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
675 / 278 / 12
Регистрация: 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
29 / 29 / 15
Регистрация: 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
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
08.09.2015, 11:43 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
Эксперт С++
4728 / 2932 / 242
Регистрация: 12.12.2009
Сообщений: 7,442
Записей в блоге: 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
3134 / 1910 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
08.09.2015, 14:00 #13
Цитата Сообщение от sion5 Посмотреть сообщение
windows!
В MFC все уже перегружено "из коробки" + полно сторонних решений (например, поищите на codeproject) + (выбор редакции) BoundsChecker.
0
Миниатюры
Проверка освобождения памяти (new, delete)  
AlexVRud
465 / 176 / 46
Регистрация: 04.07.2014
Сообщений: 484
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
08.09.2015, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2015, 15:24
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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