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();
}

デバッグモードで実行した後、VisualStudio2012の出力ウィンドウには次のように表示されます。

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();
}

生のポインタで直接new/deleteを処理する代わりに、unique_ptrまたはなどの標準(またはブースト)のスマートポインタクラスを使用することをお勧めします。shared_ptr

編集:それを扱っているNULLので 、ポインタをに設定する提案を削除しました。delete

于 2012-12-22T07:47:41.207 に答える
5

デストラクタが実行される前、つまりブロックが終了する前に、メモリをダンプしています。これを試して、違いを確認してください。

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