:는 괜찮 객체가 삭제 소유자에게하기가 그것을 나는이 같은 다소있는 시나리오가
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()'를 호출하기 전에'delete on m_a'를 호출하지 마십시오. 이것은 예외가 아닙니다. 새로운 작업이 실패하면 스택이 풀리고 잠재적으로 Owner의 소멸자에서 이중 삭제로 이어집니다 (간결함을 위해 생략 한 것으로 가정). 새로운/스왑/삭제 또는 바람직하게는 스마트 포인터를 사용하십시오. –
'Owner :: swap (Type type)'에서,'delete m_b;'행은'Owner'에 멤버 m_b가 없으므로'delete m_a;'이어야합니다. –
그 문제는 해결되었습니다. –