为什么 SHGetFolderPath() 会发生内存泄漏? (C++)
Why is there a memory leak on SHGetFolderPath()? (C++)
我正在 运行 使用 Intel Inspector 查找应用程序中的内存泄漏。
现在,情况是这样的:假设有一个名为 MyGetPath() 的函数执行以下操作:
_TCHAR szFolderPath[520] =_T("");
SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES,NULL,NULL,szFolderPath);
return _T("MemLeak");
当我 运行 Intel Inspector 报告 40 字节的泄漏时,分配站点是 SHGetFolderPath 行。但是为什么会漏气,如何避免呢?
我写了一个非常简单的程序来试验它,并用 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 张快照。
我拍摄了第一个快照并获得了一些分配:
然后我拍摄第二张快照并计算它与上一张快照之间的差异以查看SHGetFolderPath分配的内容。确实进行了一些分配:
事实上,我怀疑这是一次性分配,这是真的:我再次调用 SHGetFolderPath,拍摄新快照并将其与前一个进行比较。没有新的分配:
为了绝对确定,我做了另一个实验。只需启动无限循环并在任务管理器中检查内存使用情况:
while (true)
{
_TCHAR szFolderPath[520] = _T("");
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);
}
内存使用似乎稳定。
所以我认为你不需要关心这个小漏洞。
我正在 运行 使用 Intel Inspector 查找应用程序中的内存泄漏。 现在,情况是这样的:假设有一个名为 MyGetPath() 的函数执行以下操作:
_TCHAR szFolderPath[520] =_T("");
SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES,NULL,NULL,szFolderPath);
return _T("MemLeak");
当我 运行 Intel Inspector 报告 40 字节的泄漏时,分配站点是 SHGetFolderPath 行。但是为什么会漏气,如何避免呢?
我写了一个非常简单的程序来试验它,并用 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 张快照。
我拍摄了第一个快照并获得了一些分配:
然后我拍摄第二张快照并计算它与上一张快照之间的差异以查看SHGetFolderPath分配的内容。确实进行了一些分配:
事实上,我怀疑这是一次性分配,这是真的:我再次调用 SHGetFolderPath,拍摄新快照并将其与前一个进行比较。没有新的分配:
为了绝对确定,我做了另一个实验。只需启动无限循环并在任务管理器中检查内存使用情况:
while (true)
{
_TCHAR szFolderPath[520] = _T("");
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);
}
内存使用似乎稳定。
所以我认为你不需要关心这个小漏洞。