#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
struct A
{
A(char* p)
: p(p)
{}
~A()
{
delete this->p;
}
char* p;
};
int main()
{
A a(new char);
_CrtDumpMemoryLeaks();
}
После запуска в режиме отладки окно вывода Visual Studio 2012 показывает:
Detected memory leaks!
Dumping objects ->
{142} normal block at 0x007395A8, 1 bytes long.
Data: < > CD
Object dump complete.
В чем причина?
Возможно, он сбрасывает утечки памяти до того, как деструктор будет вызван? Пытаться:
int main()
{
{
A a(new char);
}
_CrtDumpMemoryLeaks();
}
Я предлагаю использовать стандартные (или улучшающие) классы интеллектуальных указателей, такие как unique_ptr
или же shared_ptr
вместо того, чтобы иметь дело с новым / удалить непосредственно с необработанными указателями.
РЕДАКТИРОВАТЬ:
Убрано предложение установить указатель на NULL
, поскольку delete
имеет дело с этим.
Вы сбрасываете память до того, как деструктор сможет запустить, то есть до конца блока. Попробуйте это и увидите разницу:
int main()
{
{
A a(new char);
}
_CrtDumpMemoryLeaks();
}