全局和静态函数局部之间的销毁顺序



我的理解是,具有静态存储持续时间的对象的销毁顺序与其初始化顺序相反。

在这个代码片段中:

#include <iostream>
class LogValuesObj {
public:
LogValuesObj() {
std::cout << "LogValuesObj" << std::endl;
}
~LogValuesObj() {
std::cout << "~LogValuesObj" << std::endl;
}
};
void logValues() {
static LogValuesObj o;
std::cout << "logValues function called" << std::endl;
}
class EarlyInitLogValues {
public:
EarlyInitLogValues() {
std::cout << "EarlyInitLogValues" << std::endl;
logValues();
}
~EarlyInitLogValues() {
std::cout << "~EarlyInitLogValues" << std::endl;
}
};
EarlyInitLogValues e;

int main() {
return 0;
}

我的编译器的输出是:

EarlyInitLogValues
LogValuesObj
logValues function called
~EarlyInitLogValues
~LogValuesObj

在这种情况下,销毁顺序与初始化顺序相同,我希望它是相反的。如果全局'e'和函数static-local'o'都有静态存储持续时间,为什么销毁顺序没有颠倒?

众所周知,具有静态存储持续时间的对象会以与其构造相反的顺序销毁。但更具体地说——因为这在您的情况下很重要——它们按照初始化完成的相反顺序被销毁。参见[基本开始学期]/3。

在您的情况下,o的初始化将在e的初始化之前完成。因此,eo之前被破坏。

最新更新