Consider three classes like this:
class A {
int bar;
};
class B {
A* a;
public:
B(*A na)
: a(na)
{}
~B() {
a->bar = 0;
}
};
class Foo {
A* a;
B b;
public:
Foo()
: a(new A)
, b(a)
{}
~Foo() {
delete a;
}
};
创建
Foo
的一个实例,会产生一个指向A
和拥有相同指针的B
的Foo
。
删除Foo
实例时,首先会删除指针a
,然后调用b
的析构函数,但是~B
试图访问在~Foo
中被释放的a
,导致了分段错误。有没有办法在运行
~Foo
体之前调用b
的析构函数?我知道可以通过使
b
成为指针或使a
成为非指针来解决这个问题。如果A
是抽象的,后者将无法工作,我想知道是否可以在不使b
成为指针的情况下解决这个问题。注:
A
和B
都来自库,因此我无法更改它们的实现。
a
变成指针”时,你忘记输入的缺失单词应该是“聪明”,而不是“不”。正确的答案是a
应该是一个智能指针,这样就可以按正确的顺序删除它。 - JSF