Как проверить, что память была освобождена в Visual Studio C++?

Я хочу проверить, что вся моя память была освобождена в Visual Studio 2008 на C++. Я слышал, что могу добавить несколько включений и, возможно, написать какую-нибудь строку кода, и это должно сработать.

Кто-нибудь знает, как я могу это сделать?

Заранее спасибо,

Грег

Ответов (5)

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

Чтобы избежать утечек в новом коде, используйте auto_ptr и RAAI в целом.

включить "crtdbg.h"

и использовать

_CrtDumpMemoryLeaks ()

Вы можете поискать в crtdbg другие методы, которые также могут быть полезны.

Что-то вроде этого может быть тем, что вы ищете.

#define _CRTDBG_MAP_ALLOC
#include <stdio.h> 
#include <crtdbg.h>

int main()
{
    malloc(100);
    _CrtDumpMemoryLeaks();
    return 1;
}

Один из самых старых методов - переопределить операторы new и delete (при условии, что все распределения кучи выполняются через new). Выводы Prnt, размещенные стратификационным образом внутри ваших перегруженных операторов new и delete, позволяют вам убедиться, что вы выполнили очистку перед выходом. Но это может быть немного сложно; у вас может возникнуть соблазн перегрузить новый и удалить в глобальном масштабе. Но это может привести к другим необъяснимым ошибкам. (Конечно, вы будете использовать только перегруженные операторы в режиме отладки, хорошо). Оставьте это в пределах своего класса.

Еще один разумный способ - использовать auto_ptr. Указатель, который вы хотите убедиться, что вы удалили, хранится в объекте шаблона auto_ptr в стеке. Поэтому, когда этот объект выходит за пределы области видимости, он принимает указатель, хранящийся вместе с ним.

Если вас по-прежнему беспокоят утечки, попробуйте изучить с помощью windbg. Это отличный инструмент, который поможет вам выявить утечки памяти. Я обнаружил, что действительно эффективно обнаруживать утечки, вызванные ручками.

Я искал похожий инструмент для VC++ 2003 и наткнулся на MemoryChecker от Software Verify ( www.softwareverify.com ). Не бесплатно, но по очень разумной цене (дешевле, чем Purify и Bounds Checker). Я все еще оцениваю его, но детали, которые я использовал, выглядят очень впечатляюще. Бесплатная 30-дневная пробная версия.

Вы можете отслеживать ошибки памяти (удаление вместо удаления [] и т. Д.), Утечку памяти, горячие точки памяти и т. Д., Не используя ничего подобного раньше, я считаю, что это довольно круто :)