gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:23:35 24 4
gpt4 key购买 nike

考虑如下三个类:

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 的实例,导致 Foo 带有指向 AB 的指针使用相同的指针。

Foo的实例被删除时,指针a被删除,然后调用b的析构函数,但是 ~B 尝试访问 a,它在 ~Foo 中被释放,这会导致段错误。

有没有办法在运行 ~Foo 的主体之前调用 b 的析构函数?

我知道我可以通过使 b 成为指针或使 a 成为非指针来解决这个问题。如果 A 是抽象的,则后者不起作用,我想知道是否可以不将 b 设为指针。

PS:AB 都来自一个库,所以我无法更改它们的实现。

最佳答案

遵循 RAII 原则。

更改 Foo::astd::unique_ptr<A> .删除 delete来自 ~Foo .

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

注意成员是按照声明的顺序创建的,以相反的顺序销毁。 (令人惊讶的是,初始化列表中的顺序不会改变创建顺序)。所以如果你想要 a活得更久b ,只需先声明即可。

关于c++ - 在指针成员之前调用非指针成员的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com