1

アプリケーションのメモリ リークを見つけるために Intel Inspector を実行しています。ここで、次のことを行う MyGetPath() という関数があるとします。

_TCHAR szFolderPath[520] =_T("");
SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES,NULL,NULL,szFolderPath);
return _T("MemLeak");

Intel Inspector を実行すると、40 バイトのリークが報告され、割り当てサイトは SHGetFolderPath 行です。しかし、なぜリークが発生するのでしょうか?また、それを回避するにはどうすればよいでしょうか?

4

1 に答える 1

3

私はそれを実験するための非常に単純なプログラムを書き、Deleakerを使用して、ここでどのようなリークが発生するかを見つけました。

#include <tchar.h>
#include <windows.h>
#include <Shlobj.h>

int _tmain(int argc, _TCHAR* argv[])
{
    DebugBreak(); // I take snapshot here

    _TCHAR szFolderPath[520] = _T("");
    SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);

    // Then I take snapshot here
    // and compare with previous one
    DebugBreak();

    SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);

    // Finally I take snapshot here
    // and compare with previous one
    DebugBreak();

    return 0;
}

ご覧のとおり、3 つのスナップショットを撮ります。

最初のスナップショットを取得し、いくつかの割り当てを取得しました。

スナップショット #1

次に、2 番目のスナップショットを取得し、以前のスナップショットとの差を計算して、SHGetFolderPath によって割り当てられたものを表示します。実際、いくつかの割り当てが行われました。

スナップショット #2

実際、これは 1 回限りの割り当てではないかと疑っていましたが、それは本当です。再度 SHGetFolderPath を呼び出し、新しいスナップショットを取得して、以前のスナップショットと比較します。新しい割り当てなし:

スナップショット #3

私は絶対に確かめるために別の実験をしました。無限サイクルを開始し、タスク マネージャーでメモリ使用量を確認するだけです。

while (true)
{
    _TCHAR szFolderPath[520] = _T("");
    SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);
}

メモリ使用量は安定しているようです。

ですから、この小さなリークを気にする必要はないと思います。

于 2015-05-12T20:16:37.920 に答える