C++中的销毁顺序
Destruction order in C++
#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
?
我很困惑,我想了解更多。非常感谢。
a
和 b
具有自动持续时间,在块结束时销毁。 c
是静态持续时间,在程序终止时销毁。后进先出顺序仅适用于在程序中同一点销毁的对象。
它以相反的顺序调用析构函数,但静态变量具有不同的生命周期。
参见 Does C++ call destructors for global and class static variables?,其中解释了具有全局生命周期的变量在 main
returns.
之后的某个时间被破坏
这就是后进先出法。当 main
returns 时,a
和 b
以相反的顺序被破坏,c
在 main
[=18= 之间的某个不确定点被破坏] 并且程序实际退出(因为它是静态的,与程序的生命周期相关,而不是 main
本身)。
#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
?
我很困惑,我想了解更多。非常感谢。
a
和 b
具有自动持续时间,在块结束时销毁。 c
是静态持续时间,在程序终止时销毁。后进先出顺序仅适用于在程序中同一点销毁的对象。
它以相反的顺序调用析构函数,但静态变量具有不同的生命周期。
参见 Does C++ call destructors for global and class static variables?,其中解释了具有全局生命周期的变量在 main
returns.
这就是后进先出法。当 main
returns 时,a
和 b
以相反的顺序被破坏,c
在 main
[=18= 之间的某个不确定点被破坏] 并且程序实际退出(因为它是静态的,与程序的生命周期相关,而不是 main
本身)。