オブジェクトを明示的に破棄したい (オブジェクトとそのすべてのフィールドに対してデストラクタを呼び出す) が、問題のオブジェクトへのポインタをまだ保持している場合があります。したがって、私はまだメモリを解放したくありません。代わりに、「私は破壊されたオブジェクトです」という一種のフラグを残したいと思います。
私は次のアプローチのアイデアを思いつきました:
class BaseClass { //all objects in question derive from this class
public:
BaseClass() : destroyed(false) {}
virtual ~BaseClass() {}
private:
bool destroyed;
public:
bool isDestroyed() { return destroyed; }
void destroy() {
this->~BaseClass(); //this will call the virtual destructor of a derivative class
new(this) BaseClass();
destroyed=true;
}
};
がdestroy
呼び出されると、基本的に、持っていたオブジェクト (おそらく派生オブジェクト) を破棄し、まったく同じ場所に新しい「ゾンビ」オブジェクトを作成します。その結果、次のことを達成したいと考えています。
ptr
以前にこのオブジェクトを指していた他のポインターはptr->isDestroyed()
、その存在を確認するために呼び出すことができます。- ゾンビのフラグをチェックせずに派生オブジェクトに属するフィールドにアクセスしようとすると、悪いことが起こる可能性があることを認識しています
- ゾンビ オブジェクトは、破壊されたオブジェクトと同じくらい多くのメモリを消費することを認識しています (の派生物である可能性があるため
BaseClass
) 。 - 破壊されたオブジェクトのメモリを解放する必要があります。
delete
しかし、その呼び出しがまだ正しいことを願っていますか?
質問:
上記のパターンを使用する際に考慮すべき他の問題はありますか?
ゾンビ オブジェクトを呼び出すdelete
と、以前の (通常の) オブジェクトによって消費されたメモリ全体が正しく解放されますか?
別の方法についてのご意見をお待ちしておりますが、上記のコードがもたらすすべてのリスクを理解したいと思います。