2012-02-16 30 views

答えて

10

FinalReleaseが問題である限り、あなたの質問はATLに関連していると思います。

ほとんどの場合、2つのいずれかで物を掃除することができます。 FinalReleaseは、実際のデストラクタの直前で呼び出されます。重要な違いは、他のオブジェクトを集約した場合、FinalReleaseは、トップレベルのCOMオブジェクトクラス(特にCComObject)の実際のデストラクタが動作する前に、リファレンスをクリアして依存関係を解放する機会を与えます。

つまり、集計されたオブジェクトへの最初の参照はFinalReleaseであり、他のものはFinalReleaseまたはデストラクタのいずれかになります。

1

これは一般的なアプローチです:

MyComClass::~MyComClass() 
{ 
    // Cleanup object resources in here. 
} 

ULONG __stdcall MyComClass::Release() 
{ 
    ref_count_--; 

    if (0 == ref_count_) 
    { 
     delete this; 
     return 0; 
    } 

    return ref_count_; 
} 

編集:私はに慣れていない午前ATLに関連するFinalRelease()が表示されます。

+0

あなたより。 ATLウィザードはクラスに:: Release()メソッドを追加していませんが、おそらくこの参照カウントはどこかで行われていますか?どうすれば見つけることができますか? –

+1

@SideshowBob、申し訳ありませんが、ATLウィザードを一度も使用したことがないので、そのことについてコメントすることはできません。 Roman R.は彼の答えがあればそれに慣れているようです。 – hmjd

+1

ATLは一般に、 'T CC'を継承し、' AddRef'と 'Release'の実装を最も派生したクラスに追加する' new CComObject 'を使用します。このように' delete this; 'は非仮想デストラクタ。 –

関連する問題