外部存储器管理和COM

外部存储器管理和COM,com,c++11,Com,C++11,第三方库的内存管理有问题。我有源代码,但它非常复杂(COM的东西),充满了宏和那些恼人的Microsoft注释等,并且与另一个库交互,我不需要启动它的源代码。现在,一些快速调试运行时显示,它正在以相当大的方式泄漏内存。我广泛使用像unique_ptr这样的自释放指针,并且知道我已经释放了我创建的所有东西。这是我唯一的选择,试图清理(和理解)的来源 此外,使用operator new分配COM对象是否安全,或者它们是否必须进入COM堆?COM对于如何分配自己的COM对象非常不可知。它们由类工厂创建

第三方库的内存管理有问题。我有源代码,但它非常复杂(COM的东西),充满了宏和那些恼人的Microsoft注释等,并且与另一个库交互,我不需要启动它的源代码。现在,一些快速调试运行时显示,它正在以相当大的方式泄漏内存。我广泛使用像unique_ptr这样的自释放指针,并且知道我已经释放了我创建的所有东西。这是我唯一的选择,试图清理(和理解)的来源


此外,使用operator new分配COM对象是否安全,或者它们是否必须进入COM堆?

COM对于如何分配自己的COM对象非常不可知。它们由类工厂创建,您的IUnknown::AddRef和Release方法保持引用计数。在类工厂中使用运算符new并在发布中删除此,这样做很好

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

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


如果您非常确定是COM服务器泄漏,则使用
标头和单元测试隔离问题,以执行接口方法。

+1,也应使用
SysAllocString()
系列函数在专用堆上分配BSTR,并且仅此方式。