ATL COMオブジェクトで定義したもののデストラクターコードはどこに属していますか?ATL COMオブジェクトのデストラクタコードはどこに置くのですか?
~MyComClass()
またはMyComClass::FinalRelease()
に入りますか?
ATL COMオブジェクトで定義したもののデストラクターコードはどこに属していますか?ATL COMオブジェクトのデストラクタコードはどこに置くのですか?
~MyComClass()
またはMyComClass::FinalRelease()
に入りますか?
FinalRelease
が問題である限り、あなたの質問はATLに関連していると思います。
ほとんどの場合、2つのいずれかで物を掃除することができます。 FinalRelease
は、実際のデストラクタの直前で呼び出されます。重要な違いは、他のオブジェクトを集約した場合、FinalReleaseは、トップレベルのCOMオブジェクトクラス(特にCComObject
)の実際のデストラクタが動作する前に、リファレンスをクリアして依存関係を解放する機会を与えます。
つまり、集計されたオブジェクトへの最初の参照はFinalRelease
であり、他のものはFinalRelease
またはデストラクタのいずれかになります。
これは一般的なアプローチです:
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()
が表示されます。
あなたより。 ATLウィザードはクラスに:: Release()メソッドを追加していませんが、おそらくこの参照カウントはどこかで行われていますか?どうすれば見つけることができますか? –
@SideshowBob、申し訳ありませんが、ATLウィザードを一度も使用したことがないので、そのことについてコメントすることはできません。 Roman R.は彼の答えがあればそれに慣れているようです。 – hmjd
ATLは一般に、 'T CC'を継承し、' AddRef'と 'Release'の実装を最も派生したクラスに追加する' new CComObject 'を使用します。このように' delete this; 'は非仮想デストラクタ。 –