为什么SHGetFolderPath()上存在内存泄漏? (C ++)

时间:2015-05-12 12:02:41

标签: c++ memory-leaks mfc intel-inspector

我正在运行英特尔检查器以查找应用程序中的内存泄漏。 现在,情况如下:假设有一个名为MyGetPath()的函数执行以下操作:

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

当我运行英特尔检查器时,它报告泄漏40个字节,分配站点是SHGetFolderPath行。但为什么会有泄漏,以及如何避免泄漏?

1 个答案:

答案 0 :(得分: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张快照。

我拍摄第一张快照并获得了一些分配:

snapshot #1

然后我拍摄第二张快照并计算它与之前的快照之间的差异,以查看SHGetFolderPath分配的内容。确实做了一些分配:

snapshot #2

事实上,我怀疑这是一次性分配,这是真的:我再次调用SHGetFolderPath,拍摄新快照并将其与之前的快照进行比较。没有新的分配:

snapshot #3

我做了另一个实验,绝对确定。只需启动无限循环并检查任务管理器中的内存使用情况:

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

内存使用似乎很稳定。

所以我认为你不需要关心这个小漏洞。