C ++中的销毁顺序

时间:2019-02-27 00:56:10

标签: c++ destructor

#include <iostream>
class X{
public:
    X(int n = 0) : n(n) {}
    ~X() {std::cout << n;}
    int n;
};
void main()
{
    X a(1);
    const X b(2);
    static X c(3);
}

输出为213,我认为析构函数使用LIPO堆栈,那么为什么它不以相反的顺序析构321

我很困惑,我想了解更多。非常感谢。

3 个答案:

答案 0 :(得分:3)

ab具有自动持续时间,在块结束时销毁。 c具有静态持续时间,在程序终止时销毁。 LIFO顺序仅适用于在程序中同一点销毁的对象。

答案 1 :(得分:1)

它以相反的顺序调用析构函数,但是静态变量具有不同的生存期。

请参见Does C++ call destructors for global and class static variables?,其中解释了具有全局生存期的变量在main返回之后的某个时间被破坏。

答案 2 :(得分:1)

那是LIFO。 a返回时bmain的破坏顺序相反,c返回与程序实际退出之间的某个不确定的时间点main被破坏(因为它是静态的,与程序的生命周期相关,而不是main本身。)