2008-11-18 62 views
0

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

回答

1

CreateInstance會給你一個引用計數爲1的對象,所以你不需要AddRef它。 (您使用的智能指針將在銷燬時用於對象Release)。同樣,您從方法中接收的對象應該已經增加了引用計數,因此您不需要再次使用它們 - 但是您確實需要Release它們,除非你使用智能指針。

.NET公開的COM組件與任何其他技術所寫的COM組件沒有區別。垃圾收集器不會收集任何從COM引用引用的.NET對象。