クラスの共有ポインターを作成する必要があります。他の多くのことの中で、共有ポインターが指しているオブジェクトを削除できるようにする必要があります。
保護されたデストラクタを持つオブジェクトで動作するソリューションをコーディングするにはどうすればよいですか?
delete
さらに、placement new を使用してオブジェクトが作成された場合、そのスペースがまだ使用されている可能性があるため、オブジェクトを呼び出すべきではありません(delete
呼び出しは機能しますか?)。そのようなケースをどのように検出できますか?
仕様の関連ビット:
void reset();
スマート ポインターは、ヌル ポインターを指すように設定されます。現在ポイントされているオブジェクトの参照カウントがあれば、その参照カウントが減分されます。Sptr(); null ポインターを指すスマート ポインターを構築します。
template <typename U> Sptr(U *);
指定されたオブジェクトを指すスマート ポインターを構築します。参照カウントは 1 に初期化されます。
Sptr(const Sptr &);
template <typename U> Sptr(const Sptr<U> &);
参照カウントがインクリメントされます。U * が暗黙的に T * に変換できない場合、構文エラーが発生します。適切な操作のためには、通常のコピー コンストラクターとメンバー テンプレート コピー コンストラクターの両方を指定する必要があることに注意してください。
コードの呼び出し方法:
Sptr<Derived> sp(new Derived);
char *buf = (char *) ::operator new(sizeof(Sptr<Base1>));
Sptr<Base1> &sp2 = *(new (buf) Sptr<Base1>());
sp2 = sp;
sp2 = sp2;
sp.reset();
sp2.reset();
::operator delete(buf);
Base1
すべてが保護されています。