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

原因是什么?

4

2 回答 2

7

也许它在实际调用析构函数之前转储了内存泄漏?尝试:

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

我建议使用标准的(或 boost 的)智能指针类,例如unique_ptror shared_ptr,而不是直接使用原始指针处理 new/delete。

编辑: 删除了将指针设置为的建议NULL,因为delete处理了这个问题。

于 2012-12-22T07:47:41.207 回答
5

在析构函数有机会运行之前,即在块结束之前,您正在转储内存。试试这个,看看有什么不同:

int main()
{
    {
        A a(new char);
    }
    _CrtDumpMemoryLeaks();
}
于 2012-12-22T07:47:37.073 回答