0

重複の可能性:
安全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で別のメソッドを呼び出し、 . スタックは次のようになります。DelegateItselfObject

  • オブジェクト::~オブジェクト()
  • DelegateItself::deleteMe()
  • オブジェクト::クレイジーメソッド()

したがって、デストラクタ メソッドが終了した後、deleteMeメソッドも終了します (しばらくしてから)。しかし、crazyMethod存在しないオブジェクトはどうなるでしょうか? 変数を使用しようとするとObject::a、実際の値の代わりにガベージが取得される可能性があります (データは無効になります) [C++ ロジックを理解できれば幸いです]。別のメソッドを呼び出そうとすると、Objectクラッシュする可能性があります [そうであることを願っています]。しかし、後続のメソッドが呼び出されない場合、正しく終了することが保証されますか?crazyMethod

4

0 に答える 0