ksb*_*ksb 8 c++ smart-pointers ownership-semantics
假设有一个对象A拥有一个对象B via std::unique_ptr<B>
.进一步B保持对A的原始指针(弱)引用.然后A的析构函数将调用B的析构函数,因为它拥有它.
在B的析构函数中访问A的安全方法是什么?(因为我们也可能在A的析构函数中).
一种安全的方法是在A的析构函数中明确重置对B的强引用,以便以可预测的方式销毁B,但一般的最佳实践是什么?
我不是语言律师,但我认为没关系。您正踏入危险的境地,也许应该重新考虑您的设计,但如果您小心的话,我认为您可以依赖这样一个事实:成员以与声明相反的顺序被破坏。
所以这没问题
#include <iostream>
struct Noisy {
int i;
~Noisy() { std::cout << "Noisy " << i << " dies!" << "\n"; }
};
struct A;
struct B {
A* parent;
~B();
B(A& a) : parent(&a) {}
};
struct A {
Noisy n1 = {1};
B b;
Noisy n2 = {2};
A() : b(*this) {}
};
B::~B() { std::cout << "B dies. parent->n1.i=" << parent->n1.i << "\n"; }
int main() {
A a;
}
Run Code Online (Sandbox Code Playgroud)
现场演示。
因为 的成员按then then的A
顺序被破坏。但这不行n2
b
n1
#include <iostream>
struct Noisy {
int i;
~Noisy() { std::cout << "Noisy " << i << " dies!" << "\n"; }
};
struct A;
struct B {
A* parent;
~B();
B(A& a) : parent(&a) {}
};
struct A {
Noisy n1 = {1};
B b;
Noisy n2 = {2};
A() : b(*this) {}
};
B::~B() { std::cout << "B dies. parent->n2.i=" << parent->n2.i << "\n"; }
int main() {
A a;
}
Run Code Online (Sandbox Code Playgroud)
现场演示。
因为在尝试使用它n2
时已经被破坏了。B