C++11 块作用域与全局作用域中静态对象的生命周期结束

C++11 块作用域与全局作用域中静态对象的生命周期结束,c++11,static,lifetime,raii,C++11,Static,Lifetime,Raii,在这段关于程序退出的文章中 如果线程本地或静态对象A的构造函数或动态初始化的完成顺序在线程本地或静态对象B之前,则B的销毁完成顺序在A的销毁开始之前 “之前排序”是什么意思 特别是这个节目, struct Object { Object() { } ~Object() { } }; Object a; void f() { static Object b; } int main() { f(); } 假设a.Object()在b.Object()之后调用a.Obj

在这段关于程序退出的文章中

如果线程本地或静态对象A的构造函数或动态初始化的完成顺序在线程本地或静态对象B之前,则B的销毁完成顺序在A的销毁开始之前

“之前排序”是什么意思

特别是这个节目,

struct Object {
  Object() {
  }
  ~Object() {
  }
};

Object a;

void f() {
  static Object b;
}

int main() {
  f();
}
假设
a.Object()
b.Object()
之后调用
a.Object()
是因为
a.Object()
b.Object()之前调用

“之前排序”是什么意思

对象在运行时由运行时环境按顺序初始化。如果一个对象的初始化在第二个对象的初始化之前,那么第一个对象的构造将在第二个对象的构造之前“排序”

假设
a.Object()
b.Object()
之后调用
a.Object()
是因为
a.Object()
b.Object()之前调用

如果您可以假设
a.Object()
b.Object()
之前调用,那么您可以假设
a.~Object()
b.~Object()
之后调用。然而,情况并非总是如此。在您发布的代码中,这是正确的。但在更复杂的应用程序中,有可能在初始化
a
之前调用
f()