Class 析构函数的调用顺序与它们初始化时的预期顺序相反

Class Destructors not being called in the expected reverse order from which they were initialized in

我正在测试智能指针及其工作原理,然后我 运行 遇到了一个“问题”。这是我将要讨论的代码:

#include <iostream>
#include <memory>

class B; // forward declaration

class A {

private:
    std::shared_ptr<B> b_ptr;

public:
    void set_B(std::shared_ptr<B> &b) {

        b_ptr = b;
        std::cout << b_ptr.use_count() << std::endl;
    }

    A() { std::cout << "A Constructor" << std::endl; }
    ~A() { std::cout << "A Destructor" << std::endl; }

};

class B {

private:
    std::weak_ptr<A> a_ptr;

public:
    void set_A(std::shared_ptr<A> &a) {

        a_ptr = a;
        std::cout << a_ptr.use_count() << std::endl;
    }

    B() { std::cout << "B Constructor" << std::endl; }
    ~B() { std::cout << "B Destructor" << std::endl; }

};

int main() {

    std::shared_ptr<A> a{std::make_shared<A>()};
    std::shared_ptr<B> b{std::make_shared<B>()};

    a->set_B(b);
    b->set_A(a);

    return 0;

}

这是 运行:

时的输出
A Constructor
B Constructor
2
1
A Destructor
B Destructor

现在我的问题是为什么析构函数在初始化时没有按相反的顺序被调用,例如(这是我期望的输出):

A Constructor
B Constructor
2
1
B Destructor
A Destructor

以上输出是我所期望的,但事实并非如此。我能想到的是:

A 拥有对 B 的引用。

您的 main 范围拥有对 AB 的引用。当 main 结束时,它会删除 B 引用,然后是 A.

B 引用将引用计数减为 1。A 减为 0。然后运行 ​​As 析构函数。

析构函数体运行后,每个成员都被销毁。 AB 的引用消失了。 Bs 析构函数被调用。

因此您看到的顺序。