对析构函数调用的困惑

Confusion about destructor's calling

析构函数是在对象被销毁之前调用还是在对象被销毁之后调用? 我认为它是在对象被销毁之前调用的,因为在对象被销毁之后我们无法访问该内存以释放其中的任何资源但是如果我错了那么请纠正我以便我可以很好地理解它

#include <iostream>
#include <cassert>
#include <cstddef>
class Check
{
public:
    int neu{};
    Check() = default;
    Check(int n)
    {
        neu = n;
    }
    void print()
    {
        std::cout << neu << std::endl;
    }
    ~Check()
    {
        std::cout << "It has been destroyed "<<neu <<std::endl;
    }
};
int main()
{
    Check let,see(30);
    let.print();
    return 0;
    // does destructor gets called here
} // or does destructor gets called herecode here

Does a destructor gets called before an object is destroyed or after an object is destroyed?

调用析构函数时对象的生命周期结束。对象被析构函数销毁。

    // does destructor gets called here
} // or does destructor gets called herecode here

确实没有实际区别。

自动对象在块内是活动的,在块外是不活动的。退出块时,对象将被销毁。因此,可以合理地说它们在右大括号所在的位置被销毁。

来自 ISO 标准(特殊成员函数 - 析构函数):

Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the destructor is invoked for an object whose lifetime has ended.

调用析构函数本质上是描述需要考虑对象被销毁的动作。可以显式调用析构函数,它会导致该对象的生命周期结束。显式调用很少见,通常是针对由 placement new 创建的对象。

鉴于提供的示例,问题实际上是关于析构函数调用的顺序。子对象的析构函数(包括 base class-type,如果有的话)在之后被调用。因此您可以安全地访问它们,直到退出析构函数。调用顺序基于声明顺序,就像初始化顺序一样,但相反。 base-class 类型的子对象被认为是第一个进行初始化,最后一个进行销毁。