0

new管理されていない世界で作業する場合、ヒープにメモリを割り当てた場合 (たとえば、C++ でキーワードを使用して) は、自分でクリーンアップする必要があります。また、後でそれを使用しAddRefて作成された COM コンポーネントを確認する必要があります。おそらく次のようなもの:CreateInstanceRelease

SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
    obj->AddRef();
    m_anotherObj= obj->GetObj();
    obj->Release();
}

明らかに、スマート ポインターなど (C++ で) を使用できますが、それは重要ではありません...

AddRef/ReleaseCOM コンポーネントから取得されたオブジェクト (上記の例の m_anotherObj など)についても必要ですか?

さらにややこしいことに、この特定のコンポーネントが、実際には .NET コンポーネントであり、COM インターフェイスを介してアンマネージ コードに公開されている場合はどうなるでしょうか。ガベージ コレクターはデータを片付ける方法を知っていますか? それとも、管理されていない世界ですべて手動で行う必要がありますか?

4

1 に答える 1

1

CreateInstance参照カウントが 1 のオブジェクトが返されるため、その必要はありませんAddRef。(使用したスマート ポインターはRelease、オブジェクトが破棄されたときにオブジェクトを削除します。) 同様に、メソッドから受け取るオブジェクトの参照カウントは既にインクリメントされている必要があるため、AddRefそれらを再度参照する必要はありませんが、そうReleaseでない限り、参照カウントは必要です。スマートポインタを使用。

.NET によって公開される COM コンポーネントは、他のテクノロジによって記述された COM コンポーネントと何ら変わりはありません。ガベージ コレクターは、COM 参照から参照される .NET オブジェクトを収集しません。

于 2008-11-18T11:25:35.537 に答える