对象是否可以告诉其所有者删除它

时间:2011-02-11 20:58:07

标签: c++ pointers delete-operator

我的情况有点像这样:

class Owner {
public:
  enum Type {TypeB, TypeC};
  void swap(Type type);
private:
  A* m_a;
};

class A {
};

class B : public A {
  void foo();
  Owner* m_owner;
};

class C : public A {
  void bar();
  Owner* m_owner;
};

void Owner::swap(Type type) {
  if (type == TypeC) {
     delete m_a;
     m_a = new C();
  } else if (type == TypeB) {
     delete m_a;
     m_a = new B();
  }
}

void B::foo() {
  m_owner->swap(TypeC);
  // will be deleted after this!!
}

有一个所有者类,它有一个指向基类型A的指针.B类型的对象有一个指向其所有者的指针。有一种情况我们希望该对象告诉其所有者将其换成另一种A类型:C。

B :: foo告诉其拥有者删除它是否安全?我知道如果你在调用Owner :: swap()之后做了什么,它就会崩溃。它有点像“删除这个”场景。

3 个答案:

答案 0 :(得分:2)

如果您已将A的析构函数定义为virtual,那么这是完全可以的。

顺便说一下,你的代码需要小的修正:

else if (type == TypeB) {
     delete m_a; //not m_b, as Owner doesn't have any member named `m_b`.
     m_a = new B();
  }

但我想知道哪个对象在这里删除了,那个调用swap函数的对象?如果是这样,那么我会说你的课程存在设计问题,之后你的程序可能会崩溃。

答案 1 :(得分:1)

如果在调用swap后尝试访问类中的字段,它将崩溃(不一定会崩溃,但会启动内存损坏情况)。

我所说的只是:

void B::foo() {
  //this valid
  m_owner->swap(TypeC);
  //this invalid
}

答案 2 :(得分:1)

可以说对象所有者只要你不再使用它就删除它。一个物体也可以自杀(delete this),标准在这种情况下不做任何道德判断。