委托删除自我的方法:可能的问题?

时间:2012-06-29 23:26:04

标签: c++

  

可能重复:
  Is it safe to delete this?

好的,我想使用一些Object及其代理人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 ++中起作用 - 从盒子里开始?
我的问题是:当我在Object中运行一个方法时,我从另一个对象(DelegateItself)中调用另一个方法并删除Object。堆栈将是:

  • 对象::〜对象()
  • DelegateItself :: DELETEME()
  • 对象:: crazyMethod()

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

0 个答案:

没有答案