我的情况有点像这样:
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()之后做了什么,它就会崩溃。它有点像“删除这个”场景。
答案 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
),标准在这种情况下不做任何道德判断。