Explorer扩展中的内存泄漏

时间:2018-06-15 09:06:56

标签: memory-leaks windows-explorer-integration

我们有一个资源管理器扩展程序,可让用户浏览外部设备的内容。扩展工作正常,但经过一夜的自动测试后,资源管理器进程的内存占用量激增。我花了一天时间设置一个环境,我可以使用UMHD转储资源管理器进程的快照,然后比较它们以查看泄漏情况。它指出了一些不同的功能,但根据文档,我们正确使用它们。

SHGetNameFromIDList

调用此函数以获取GetDisplayNameOf实现中的文件夹名称。使用返回的字符串后,使用指定的CoTaskMemFree函数释放它。然而,根据UMHD,这个过程有时会泄漏记忆。但有时候只是。对于一次测试,我计算了这个函数的> 5000次调用,但只有约1%的函数被泄露。我还检查了没有任何调用返回错误代码。我需要知道一些线程问题吗?

另一件事,我看到(在堆栈跟踪中)函数ntdll!RtlpAllocateHeap用于分配内存,而不是你可能期望的CoTaskMemAlloc

SHCreateDataObject

此函数用于GetIOObjectOf实现,也有泄漏。看来我们这里分配的对象永远不会被资源管理器释放。我们应该免费吗?在那种情况下?

_vsnprintf_s

此函数还使用ntdll!RtlpAllocateHeap函数来分配泄漏的内容。为什么?

我在使用W10 Pro 1803。

此外,在检查快照之间的比较时,只有一小部分泄漏实际上包含我们的代码。看起来探险家的漏洞非常糟糕。

有什么建议吗?

0 个答案:

没有答案