0

すべて、これらのコードのビジュアルスタジオでメモリリークを検出するための良い方法またはツールを誰か教えてもらえますか? crt デバッグをテストしましたが、デバッグ プロセスを中止している間 (shift+f5)、デバッグ ウィンドウにメモリ リーク レポートが表示されません。

void fun1()
{
    int * pInt = new int;
    return;
}
void Execute(void)
{
    while(true)
    {
        cout<<"I will sleep for 1 second..."<<endl;
        ::Sleep(1000);
        fun1();
    }
    return;
}
int main()
{
    Execute();
    return 0;
}

上記のコードのメモリを見つける方法を知っている人はいますか? ところで、shared_ptr を使用することを選択した場合、メモリ リークは再び発生しませんよね?

4

4 に答える 4

1

ここでの問題は非常に単純です。プロセスを中止すると、メモリ リークが多かれ少なかれ当然のことと見なされます。コードが通常はリークしない場合でも、デバッガで中止すると (運が良ければ) リークが発生します。とにかく記憶。そのため、通常はメモリ リークを報告するほとんどのツールは、デバッガでプログラムを中止すると報告しません。

そのため、リーク レポートを表示するには、デバッガーで強制終了するのではなく、ある時点で自動的に終了するコードを記述する必要があります。コードを次のように変更すると、次のようになります。

void fun1()
{
    int * pInt = new int;
    return;
}
void Execute(void)
{
    for (int i=0; i<100000; i++)
    {
        //cout<<"I will sleep for 1 second..."<<endl;
        //::Sleep(2000);
        fun1();
    }
    return;
}
int main()
{
    Execute();
    return 0;
}

ところで、2000パラメータとして に渡す場合Sleep、1 秒だけでなく、少なくとも 2 秒スリープすることを期待する必要があります。coutとりあえず、 andをコメントアウトしたSleepので、すぐにメモリ リークが発生し、リーク レポートが生成されるはずです。多くの出力と Sleeping を使用すると、同じことが行われますが、より遅く騒々しくなります。

于 2012-04-24T15:25:57.713 に答える
0

これをメイン関数の先頭に追加しても機能しませんか?

#if defined(DEBUG) | defined (_DEBUG)
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

デバッグモードで実行する必要があります。

于 2012-04-24T15:18:49.120 に答える
0

問題は、プロセスの実行中に、自動化されたプロセスがどのメモリがリークしたかを判断するのが難しいことです。オブジェクトとメモリ ブロックへの参照を追跡する言語では、これをいつでも実行できます。参照のないブロックを見つけるだけで済みます。C/C++ では (自分で実装しない限り) そのようなことはありません。そのため、メモリ ブロックがリークされているかどうかを実際に判断することはできません。

このような場合にできることの 1 つは、メモリ リークをダンプする関数をトリガーすることです。これは、プロセスの有効期間内で、リークが発生してはならないことがわかっている時点で発生します。たとえば、アプリケーションで Execute() while ループの各反復の最後にリークがあってはならないことがわかっているとします。次に、次のようなことができます。

#include <crtdbg.h>

void fun1()
{
    int * pInt = new int;
    return;
}
void Execute(void)
{
    int i = 0;
    while(true)
    {
        cout<<"I will sleep for 1 second..."<<endl;
        ::Sleep(2000);
        fun1();

        #ifdef _DEBUG
        // dump any leaks every 100 iterations
        if (++i % 100 == 0)
            _CrtDumpMemoryLeaks();
        #endif
    }
    return;
}
int main()
{
    Execute();
    return 0;
}

_CrtDumpMemoryLeaks() および MSVC CRT ライブラリのその他の関数については、このページを参照してください。

これが役立つことを願っています。

于 2012-04-24T15:36:23.680 に答える
-1

VSについてはわかりません。Linuxではvalgrindを使用します。

于 2012-04-24T15:19:36.587 に答える