3

我们有一个在 Windows 上运行的原生 C++ 应用程序,它使用组件对象模型 (COM) 作为客户端。在我们的例子中,我们可以使用IUIAutomation. 不幸的是,我们的代码中存在内存泄漏,使用我们的基本内存调试方法没有显示出来:

_CRTDBG_MAP_ALLOC- http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

我们如何调试与我们滥用 COM/IUnknown/和跨 COM 屏障的内存分配相关的可执行文件中的内存泄漏?

我们在工具/库/等方面很灵活。我们在运行 Visual Studio 2012 的 Windows 8 上。

4

1 回答 1

1

它可能与BSTR 缓存有关。

基本上,OLE 缓存在进程中分配的所有 BSTR 对象,以允许它汇集字符串。结果,这些字符串被“故意”有效地泄露了。知识库文章指出,当 OLEAUT32.DLL 的 DLL_PROCESS_DETACH 逻辑运行时缓存被清除,这很高兴知道,但没有帮助我调试我的 BSTR 泄漏——我仍然可能泄漏 BSTR。

好消息是您可以通过设置环境变量并重新启动来禁用此缓存。OANOCACHE=1或者你可以在你的程序中调用SetOaNoCache而不会影响你的整个操作系统。

于 2016-05-20T07:31:33.523 回答