非托管代码使用的.NET组件的内存管理
-
08-07-2019 - |
题
在非托管世界中工作时,如果我们在堆上分配内存(例如,在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 ++中),但除此之外......
我们是否还必须AddRef/Release
获取从COM组件中获取的对象(如上例中的m_anotherObj)?
为了让事情更加混乱,如果这个特定的组件实际上是一个通过COM接口暴露给非托管代码的.NET组件会发生什么?垃圾收集器是否知道清除内容或者是否必须在非托管环境中手动完成?
解决方案
CreateInstance
会返回一个引用计数为1的对象,因此您不需要AddRef
它。 (您使用的智能指针在销毁时将Release
对象。)同样,从方法接收的对象应该已经增加引用计数,因此您不需要再次<=> - 但是您确实需要除非你使用智能指针,否则要<=>它们。
.NET公开的COM组件与任何其他技术编写的COM组件没有区别。垃圾收集器不会收集从COM引用引用的任何.NET对象。
不隶属于 StackOverflow