私はそれを実験するための非常に単純なプログラムを書き、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 つのスナップショットを撮ります。
最初のスナップショットを取得し、いくつかの割り当てを取得しました。

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

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

私は絶対に確かめるために別の実験をしました。無限サイクルを開始し、タスク マネージャーでメモリ使用量を確認するだけです。
while (true)
{
_TCHAR szFolderPath[520] = _T("");
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);
}
メモリ使用量は安定しているようです。
ですから、この小さなリークを気にする必要はないと思います。