重複の可能性:
安全delete this
ですか?
Object
さて、 someとその delegateを使用したいと思いObjectDelegate
ます。
サンプルコードは次のとおりです。
class ObjectDelegate;
class Object {
private:
int a;
ObjectDelegate *delegate;
void crazyMethod();
public:
Object();
~Object();
void setDelegate(ObjectDelegate*);
};
Object::Object() {
delegate = NULL;
a = 9001;
std::cout << "Object Constructor";
}
Object::~Object() {
std::cout << "Object Destructor";
}
void Object::crazyMethod() {
if(delegate != NULL) {
delegate->deleteMe(this);
}
}
//-----
class ObjectDelegate {
public:
virtual void deleteMe(Object*) = 0;
};
//------
class DelegateItself : public ObjectDelegate {
void deleteMe(Object*);
};
void DelegateItself::deleteMe(Object *object) {
delete object;
}
私はこのアプローチを Objective-C と Java でよく使用しますが、C++-from-the-box ではどのように機能しますか?
私の質問は: で 1 つのメソッドを実行しているときに、別のオブジェクト ( )Object
で別のメソッドを呼び出し、 . スタックは次のようになります。DelegateItself
Object
- オブジェクト::~オブジェクト()
- DelegateItself::deleteMe()
- オブジェクト::クレイジーメソッド()
したがって、デストラクタ メソッドが終了した後、deleteMe
メソッドも終了します (しばらくしてから)。しかし、crazyMethod
存在しないオブジェクトはどうなるでしょうか? 変数を使用しようとするとObject::a
、実際の値の代わりにガベージが取得される可能性があります (データは無効になります) [C++ ロジックを理解できれば幸いです]。別のメソッドを呼び出そうとすると、Object
クラッシュする可能性があります [そうであることを願っています]。しかし、後続のメソッドが呼び出されない場合、正しく終了することが保証されますか?crazyMethod