我有一種情況,有些類似於這樣:它是沒關係的對象,告訴它的主人將它刪除
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()之後做任何事情,它會崩潰。這有點像「刪除這個」場景。
在調用`new C()`之前,不要調用`m_a`上的delete。這不是特例安全。如果新操作失敗,這將導致堆棧展開,並可能導致所有者的析構函數中的雙重刪除(爲了簡單起見,我假設您將其忽略)。做一個新/交換/刪除或最好使用智能指針。 – 2011-02-11 21:09:21
在`Owner :: swap(Type type)`中,`delete m_b;`行應該是'delete m_a;`,因爲`Owner`中沒有成員`m_b`。 – 2011-02-11 21:16:11
我修復了這個問題,thx。 – 2011-02-11 21:18:23