Поиск типа неизвестного объекта в C++

Существует множество способов проверить программы на наличие утечек памяти. В итоге вы получите этот список указателей на блоки памяти с утечкой, но есть ли хороший способ узнать больше информации для каждого блока? Например: если я знаю, что объект был строкой, фактическое строковое значение могло бы значительно упростить поиск утечки.

Есть ли лазейка в RTTI, которая делает это возможным?

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


person Hans    schedule 09.12.2008    source источник


Ответы (3)


RTTI может вам не помочь. RTTI работает только в том случае, если классы имеют виртуальные методы, и не все выделения относятся к объектам с виртуальными методами.

Что вам действительно нужно сделать, так это каким-то образом прикрепить трассировку стека к вашим распределениям. Затем вы можете получить информацию о том, где была выделена память. Вы бы искали конструктор класса, если бы это были объекты с утечкой памяти.

Во всяком случае, есть ли что-то подобное там? Да. Бесплатная библиотека для Windows — Visual Leak Detector. Существуют более полнофункциональные коммерческие продукты (такие как Bounds Checker и IBM Rational Purify), но VLD прекрасно работает. Это помогало мне бесчисленное количество раз обнаруживать утечки памяти.

person Kevin    schedule 09.12.2008

Я использую valgrind --leak-check=full, который дает мне трассировку стека сайта размещения каждого просочившегося блока. Эта информация гораздо полезнее, чем просто информация о типе. valgrind (произносится как "Вэл ухмыльнулся") потрясающе!

person Norman Ramsey    schedule 09.12.2008

как и Норман, я выступаю за valgrind. Это действительно хороший совет для анализа трассировки стека!

Я использую его для сборки в KDevelop.

person berlindev    schedule 09.12.2008