Должен ли RAII вызывать утечки памяти?

#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.

В чем причина?

0

Решение

Возможно, он сбрасывает утечки памяти до того, как деструктор будет вызван? Пытаться:

int main()
{
{
A a(new char);
}
_CrtDumpMemoryLeaks();
}

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

РЕДАКТИРОВАТЬ:
Убрано предложение установить указатель на NULL, поскольку delete имеет дело с этим.

7

Другие решения

Вы сбрасываете память до того, как деструктор сможет запустить, то есть до конца блока. Попробуйте это и увидите разницу:

int main()
{
{
A a(new char);
}
_CrtDumpMemoryLeaks();
}
5

По вопросам рекламы [email protected]