アンマネージコードで使用される.NETコンポーネントのメモリ管理
-
08-07-2019 - |
質問
管理されていない世界で作業する場合、ヒープにメモリを割り当てた場合は、自分でクリーンアップする必要があります(たとえば、C ++で new
キーワードを使用して)。また、 CreateInstance
を使用して作成され、後で Release
するために AddRef
COMコンポーネントを作成する必要があります。おそらく次のようなものです:
SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
obj->AddRef();
m_anotherObj= obj->GetObj();
obj->Release();
}
明らかに、スマートポインターなどの(C ++で)スマートポインターを使用できますが、それはポイントのほかにあります...
COMコンポーネント(上記の例のm_anotherObjなど)から取得したオブジェクトの AddRef / Release
も必要ですか?
事態をより混乱させるために、この特定のコンポーネントが実際にはCOMインターフェイスを介してアンマネージコードに公開されている.NETコンポーネントである場合はどうなりますか?ガベージコレクターは、ものを片付けることを知っていますか、それとも管理されていない世界ですべて手動で行う必要がありますか?
解決
CreateInstance
は、参照カウントが1のオブジェクトを返すので、 AddRef
する必要はありません。 (使用したスマートポインターは、オブジェクトが破棄されると Release
します。)同様に、メソッドから受け取るオブジェクトは参照カウントが既にインクリメントされている必要があるため、 AddRef
それらをもう一度-しかし、スマートポインターを使用している場合を除き、それらを Release
する必要があります。
.NETによって公開されるCOMコンポーネントは、他のテクノロジによって作成されたCOMコンポーネントと変わりません。ガベージコレクターは、COM参照から参照される.NETオブジェクトを収集しません。