new
在非托管世界中工作时,如果我们在堆上分配了内存(例如,在 C++ 中使用关键字),我们必须确保自己清理干净;我们还必须确保我们以后使用它AddRef
创建的 COM 组件;也许是这样的:CreateInstance
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),我们是否也必须这样做?
更令人困惑的是,如果这个特定组件实际上是一个 .NET 组件,它通过 COM 接口暴露给非托管代码,会发生什么?垃圾收集器是否知道清理东西,还是必须在非托管世界中手动完成?