在非托管世界中工作时,如果我们在堆上分配内存(例如,在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对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top