参照カウントを実装するには、 のIUnknown
ようなインターフェイスとスマート ポインター テンプレート クラスを使用します。インターフェイスには、以下を含むすべての参照カウント メソッドの実装がありますRelease()
。
void IUnknownLike::Release()
{
if( --refCount == 0 ) {
delete this;
}
}
スマート ポインター テンプレート クラスには、生のポインターを受け入れるコピー コンストラクターと代入演算子があります。したがって、ユーザーは次のことができます。
class Class : public IUnknownLike {
};
void someFunction( CSmartPointer<Class> object ); //whatever function
Class object;
someFunction( &object );
そして、プログラムは未定義の動作を実行します。オブジェクトは参照カウント 0 で作成され、スマート ポインターが構築されて 1 にバンプされます。その後、関数が戻り、スマート ポインターが破棄され、スタックに割り当てられた変数が呼び出さRelease()
れます。delete
ユーザーは次のこともできます。
struct COuter {
//whatever else;
Class inner;// IUnknownLike descendant
};
COuter object;
somefunction( &object.Inner );
また、で作成されていないオブジェクトnew
はdelete
d です。最高の未定義の動作。
ユーザーが派生したすべてのオブジェクトを作成するためにIUnknownLike
強制的に使用するようにインターフェイスを変更する方法はありますか?new
IUnknownLike