0

可能重复:
安全delete this吗?

好的,我想使用 someObject和它的 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 中工作?
我的问题是:当我在其中运行一个方法时,Object我从它调用另一个对象()中的另一个方法DelegateItself并删除Object. 堆栈将是:

  • 对象::~对象()
  • 委托本身::deleteMe()
  • 对象::crazyMethod()

所以在析构方法结束deleteMe后方法也结束(一段时间后)。crazyMethod但是不存在的对象会发生什么?如果我尝试使用变量Object::a,我将有可能获得垃圾而不是实际值(数据将无效)[希望我理解 C++ 逻辑]。如果我尝试在其中调用另一种方法,Object我可能会崩溃[希望如此]。但是如果没有后续方法被调用,是否可以保证正确结束?crazyMethod

4

0 回答 0