调试Windows组件对象模型(COM)中的内存泄漏



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

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

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

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

这可能与BSTR缓存有关。

基本上,OLE缓存进程中分配的所有BSTR对象,以便将字符串汇集在一起。因此,这些字符串实际上是"故意"泄漏的。KB文章指出,当OLEAUT32.DLL的DLL_PROCESS_DETACH逻辑运行时,缓存会被清除,这很好,但对我调试BSTR泄漏没有帮助——我可能仍然在泄漏BSTR。

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

最新更新