我们有一个资源管理器扩展程序,可让用户浏览外部设备的内容。扩展工作正常,但经过一夜的自动测试后,资源管理器进程的内存占用量激增。我花了一天时间设置一个环境,我可以使用UMHD转储资源管理器进程的快照,然后比较它们以查看泄漏情况。它指出了一些不同的功能,但根据文档,我们正确使用它们。
SHGetNameFromIDList
调用此函数以获取GetDisplayNameOf
实现中的文件夹名称。使用返回的字符串后,使用指定的CoTaskMemFree
函数释放它。然而,根据UMHD,这个过程有时会泄漏记忆。但有时候只是。对于一次测试,我计算了这个函数的> 5000次调用,但只有约1%的函数被泄露。我还检查了没有任何调用返回错误代码。我需要知道一些线程问题吗?
另一件事,我看到(在堆栈跟踪中)函数ntdll!RtlpAllocateHeap
用于分配内存,而不是你可能期望的CoTaskMemAlloc
。
SHCreateDataObject
此函数用于GetIOObjectOf
实现,也有泄漏。看来我们这里分配的对象永远不会被资源管理器释放。我们应该免费吗?在那种情况下?
_vsnprintf_s
此函数还使用ntdll!RtlpAllocateHeap
函数来分配泄漏的内容。为什么?
我在使用W10 Pro 1803。
此外,在检查快照之间的比较时,只有一小部分泄漏实际上包含我们的代码。看起来探险家的漏洞非常糟糕。
有什么建议吗?