在指针成员之前调用非指针成员的析构函数

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都来自图书馆,所以我无法改变他们的实施.

Yak*_*ont 7

遵循RAII原则.

更改Foo::astd::unique_ptr<A>.取出delete~Foo.

它现在将在结束之后~Foo和之后被销毁b.~Bar().

请注意,成员是按声明的顺序创建的,并以相反的顺序销毁.(令人惊讶的是,初始化列表中的顺序不会改变创建顺序).因此,如果您想要a活得更久b,只需先声明它.