在析构函数c ++中访问所有者

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,但一般的最佳实践是什么?

Chr*_*rew 4

我不是语言律师,但我认为没关系。您正踏入危险的境地,也许应该重新考虑您的设计,但如果您小心的话,我认为您可以依赖这样一个事实:成员以与声明相反的顺序被破坏

所以这没问题

#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顺序被破坏。但这不行n2bn1

#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