私はそれがいつ削除されるべきかを知っている1つのクラス(A
)を持っています。私はオブジェクトが自分自身を直接削除することはできないと考えています(つまり、内部からデストラクタを呼び出すことはできません)ので、コールバックを使用しました。ここでコールバックを持つ別のオブジェクトが所有するオブジェクトを、削除するオブジェクトから削除できますか?
は私の現在のソリューションの擬似コードです:
class A {
Owner* owner; // is set in constructor
A(Owner* ow) : owner(ow) {}
void willDeleteOurself() {
owner->deleteObject();
}
}
class Owner {
A* obj;
Owner() { // e.g. constructor
obj = new A(this);
}
void deleteObject() {
delete obj;
}
}
私はクラスA
のオブジェクトを所有するクラスOwner
のオブジェクトを持っています。さて、ある時点で、obj
は削除すべきであることを知っており、willDeleteOurself()
の呼び出しが発生します。このコードはうまくいくようです。
は今、私の質問はこれです:これはobj
を削除する安全な方法ですか?
ときの方法deleteObject
リターンが(}
に到達した)ので、私は心配だけど、それがバックwillDeleteOurself()
の終わりにジャンプしますが、その方法はそこからオブジェクトが破棄されていると呼ばれていました。
owner->deleteObject();
の呼び出し後にobj
を参照する文がなくなると、この構文は安全ですか?
更新:回答を
感謝。私はここで少し簡略化した。私はA* obj;
を持っていませんが、オブジェクトへのブーストsmartpointer(単独で、時にはマップ内)。私はラップされたオブジェクトのdelete this
を呼び出すと、smartpointerは基になるオブジェクトが削除されたことを認識しません。あれは正しいですか?
delete this
(上記のコードも)は「危険」ですが、私の問題を解決する安全な方法はありますか?
はい、あなたが正しいです、直接、 'これを削除します'はより明確です。しかし、私が質問に追加したように、私はこれがスマートなポインタではうまくいかないと思う。 – dada
ここで問題となるのは1つの問題だが、リソースの管理が他の場所で処理されるならば、それがリリースされる場所になければなりません。さもなければ、あなたはリソースの管理を台無しにするでしょう。さて、操作の詳細に応じて、関数の戻り値を使って処理することがわかりました。オブジェクトは*私は今から呼び出し元に無駄です。 –