在非托管世界中工作时,如果我们在堆上分配了内存(例如,在C ++中使用new
关键字),我们必须确保自己清理干净;我们还必须确保使用AddRef
创建的CreateInstance
个COM组件以及之后的Release
组件;也许是这样的:
SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
obj->AddRef();
m_anotherObj= obj->GetObj();
obj->Release();
}
显然我们可以使用智能指针和其他类似的东西(在C ++中),但除此之外......
对于从COM组件中获取的对象(如上例中的m_anotherObj),我们还必须AddRef/Release
吗?
为了让事情更加混乱,如果这个特定的组件实际上是一个通过COM接口暴露给非托管代码的.NET组件会发生什么?垃圾收集器是否知道清除内容或者是否必须在非托管环境中手动完成?
答案 0 :(得分:1)
CreateInstance
会返回一个引用计数为1的对象,因此您不需要AddRef
它。 (您使用的智能指针会在对象被销毁时Release
。)同样,从方法接收的对象应该已经增加了引用计数,因此您不需要再次AddRef
它们 - 但你确实需要Release
,除非你使用智能指针。
.NET公开的COM组件与任何其他技术编写的COM组件没有区别。垃圾收集器不会收集从COM引用引用的任何.NET对象。