Kri*_*itz 3 c++ pointers destructor
考虑三个这样的类:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
创建一个实例Foo,会产生一个Foo带有指向a A和a B的指针.
当Foo删除实例时,删除指针a,然后b调用析构函数,但~B尝试访问a,这被释放~Foo,导致分段错误.
有没有办法b在运行之前调用析构函数~Foo?
我知道我可以通过制作b指针或制作a非指针来解决这个问题.如果A是抽象的话,后者不起作用,我想知道如果没有b指针就可以.
PS:A并且B都来自图书馆,所以我无法改变他们的实施.
遵循RAII原则.
更改Foo::a到std::unique_ptr<A>.取出delete从~Foo.
它现在将在结束之后~Foo和之后被销毁b.~Bar().
请注意,成员是按声明的顺序创建的,并以相反的顺序销毁.(令人惊讶的是,初始化列表中的顺序不会改变创建顺序).因此,如果您想要a活得更久b,只需先声明它.