質問

管理されていない世界で作業する場合、ヒープにメモリを割り当てた場合は、自分でクリーンアップする必要があります(たとえば、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オブジェクトを収集しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top