2010-12-20 57 views
2

遇到第三方库的内存管理问题。我有源代码,但它非常复杂(COM的东西),充满了宏和烦人的微软标注等,并与另一个库,我不必启动的源相互作用。现在一些快速调试运行时已经表明它存在内存泄漏,并且有一个很大的方法。我广泛使用像unique_ptr这样的自释放指针,并且知道我释放了我创建的所有内容。是我唯一的选择来尝试清理(并理解)源代码?外部存储器管理和COM

另外,是否可以安全地使用operator new分配COM对象,还是必须进入COM堆?

回答

2

COM对于如何分配自己的COM对象是完全不可知的。它们由类工厂创建,并且您的IUnknown :: AddRef和Release方法保留引用计数。使用类工厂中的operator new和Release中的delete this很好。

你必须小心你在接口方法中返回的任何指针。典型的自动化对象,如BSTR和SAFEARRAY确实需要在COM堆中分配,以便客户端代码可以释放它们。很难搞砸了,API完成了这项工作。

客户端代码可以负责泄漏,摸索引用计数是一个非常标准的COM错误。当你有权访问AddRef/Release实现时,通常很容易诊断。在Vista或Win7中进行调试也是强烈建议的,它们有一个更好的堆管理器,它不会默默地忽略从错误的堆中释放内存的尝试。

如果你确定它是COM服务器泄漏,然后用<crtdbg.h>标题和单元测试来隔离问题以实现接口方法。

+0

+1,也应该使用'SysAllocString()'系列函数在专用堆上分配BSTR,只有这样。 – sharptooth 2010-12-21 06:13:53