gpt4 book ai didi

c++ - 为什么 SHGetFolderPath() 会发生内存泄漏? (C++)

转载 作者:行者123 更新时间:2023-11-30 02:39:01 32 4
gpt4 key购买 nike

我正在运行 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 张快照。

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

snapshot #1

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

snapshot #2

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

snapshot #3

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

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

内存使用似乎很稳定。

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

关于c++ - 为什么 SHGetFolderPath() 会发生内存泄漏? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30190306/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com