0

new在非托管世界中工作时,如果我们在堆上分配了内存(例如,在 C++ 中使用关键字),我们必须确保自己清理干净;我们还必须确保我们以后使用它AddRef创建的 COM 组件;也许是这样的:CreateInstanceRelease

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),我们是否也必须这样做?

更令人困惑的是,如果这个特定组件实际上是一个 .NET 组件,它通过 COM 接口暴露给非托管代码,会发生什么?垃圾收集器是否知道清理东西,还是必须在非托管世界中手动完成?

4

1 回答 1

1

CreateInstance会给你一个引用计数为 1 的对象,所以你不需要AddRef它。(您使用的智能指针将Release在对象被销毁时将其删除。)同样,您从方法接收的对象应该已经增加了引用计数,因此您不需要AddRef再次使用它们 - 但您确实需要Release它们,除非您是使用智能指针。

.NET 公开的 COM 组件与任何其他技术编写的 COM 组件没有什么不同。垃圾收集器不会收集从 COM 引用中引用的任何 .NET 对象。

于 2008-11-18T11:25:35.537 回答