Как проверить, есть ли утечки памяти в программе.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Всем доброго времени суток.
НаписАл я стек. Работает он нормально, но мне хочется проверить, есть ли где-нибудь утечки памяти. А именно в методе
clear()
. Как сделать это?На всякий случай, код:
Если ты используешь MS VC++, то посмотри Обнаружение утечек памяти с помощью библиотеки CRT. Работают ли эти функции под другими компиляторами и/или осями — не знаю.
Можно попробовать сделать глобальную перегрузку операторов
new
иdelete
и взять все распределение памяти в свои руки. Но мне кажется что это еще более стремный вариант в смысле напороть с распределением памяти.Не-а, исппользую
g++
подxubuntu 13.04
.Во-первых, попробуй mtrace или посмотреть здесь. Линукс не использую, поэтому совет достаточно теоретический ))
Во-вторых... Меня заинтересовало предложение Макара по поводу перегрузки
new
иdelete
. Если в программе работа с кучей идёт только через эти операторы, то такой ход возможен. В противном случае, надо применять «тяжёлую артиллерию» в видеmtrace
и подобных штук.Я накидал некий код на тему перегрузки операторов. Вроде работает ))
Идея
Идея заключается в следующем. К каждому выделяемому блоку памяти присоединять блок служебной информации, который поможет отследить операции выделения/освобождения памяти.
Реализация.
При выделении памяти перегруженным оператором
new
выделяется памяти больше, чем заказывали, на размер структурыMBLOCK
. В начале выделенного блока размещается структураMBLOCK
, а дальше идёт место для данных, для которых собственно выделялась память из кучи. Вызывающему коду возвращается указатель на это место для данных. Так что вызывающий код ничего некошерного не замечает.С помощью структуры
MBLOCK
и двух глобальных переменных организуется простейший список. В структуре содержится размер блока (без учёта служебной информации) и указатель на следующий блок. При вызовеnew
в список добавляется элемент. При вызовеdelete
из списка удаляется элемент (естественно без нарушения целостности списка).Функция
mem_report()
выводит список блоков в текстовом виде в указанный поток. По этой информации можно увидеть неосвобождённые блоки памяти, т.е. зафиксировать утечку.Для большей наглядности я в каждый перегруженный оператор добавил печать имени функции с доп. информацией.
Дополнительно в оператор
delete
добавлена печать диагностики попытки повторного освобождения блока памяти.Компилировал под gcc version 4.8.1 (tdm64-2), Win7.
dmem.h
dmem.cpp
main.cpp
Valgrind
Чтобы переварить код от Cranium, мне потребовалось немало времени :)
В основном мне всё понятно, но мне не понятен вот этот момент:
Что это значит и для чего это нужно?
Это форма операторов
new
, которая не возбуждает исключение. При недостатке памяти просто возвращается NULL.Большоое спасибо.