-2
class A
{
public:
    ~A()
    {
        std::cout << "A destroyed" << std::endl;
    }
};

class B
{
public:
    A a;
    ~B()
    {
        std::cout << "B destroyed" << std::endl;
    }
};

int main()
{
    B b;
    b.~B();
}

输出:

B destroyed
A destroyed
B destroyed
A destroyed

有人可以向我解释这里发生了什么吗?我希望输出是

B destroyed
A destroyed

(一次当 ~B() 被调用,一次 ~A() 被调用)。

4

1 回答 1

2

退出范围时,在有限范围内创建的任何对象都将被销毁。这意味着,如果您在 stack 上创建了一个对象那么当 stack 折回时,它将与该范围内声明的任何其他变量一起被销毁。

唯一的例外是当您使用对象的动态分配时,使用关键字new,这会在堆上创建对象,该对象不会自行清理。但即便如此,调用delete也会自行调用析构函数。

话虽如此,为了避免使用newanddelete和更好的资源管理,有一些类型(例如智能指针)可以自己处理这些,在一种称为 Resource Allocation Is Initialization (或RAII)的技术中,这使得事情简单得多(你进入第一部分,所有内容都分配在堆栈上,因此在折叠时会自动调用析构函数)。

于 2020-11-29T10:08:25.387 回答