Поиск типа неизвестного объекта в C ++ - PullRequest
4 голосов
/ 09 декабря 2008

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

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

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

Ответы [ 3 ]

6 голосов
/ 09 декабря 2008

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

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

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

5 голосов
/ 09 декабря 2008

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

0 голосов
/ 09 декабря 2008

как норманн я защищаю для Вальгринд . Это действительно хороший совет для анализа трассировки стека!

Я использую его в KDevelop.

...