在非託管環境中工作時,如果我們已經在堆上分配了內存(例如,通過在C++中使用new
關鍵字),我們必須確保自己清理完畢。我們還必須確保我們AddRef
COM組件使用CreateInstance
和Release
後創建;也許是這樣的:非託管代碼使用的.NET組件的內存管理
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接口暴露給非託管代碼,會發生什麼?垃圾收集器是否知道要清理東西,還是必須在非託管的環境中手動完成?