块范围内的静态对象的生命周期与全局范围的结束

时间:2017-01-19 19:46:08

标签: c++11 static lifetime raii

在这段关于程序退出cppreference.com

的文章中
  

如果构造函数的完成或线程局部或静态对象A的动态初始化在线程局部或静态对象B之前被排序,则在破坏A开始之前对B的销毁完成进行排序。

“之前排序”的含义是什么?

特别是,对于这个程序

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

Object a;

void f() {
  static Object b;
}

int main() {
  f();
}

可以安全地假设a.~Object()b.~Object()后被称为,因为a.Object() b.Object()之前被称为

1 个答案:

答案 0 :(得分:0)

  

“之前排序”是什么意思?

对象在运行时由序列中的运行时环境初始化。如果在初始化第二个对象之前初始化了一个对象,那么第一个对象的构造就是“在构造第二个对象之前进行排序”。

  

是否可以安全地假设在a.~Object()后调用b.~Object(),因为在a.Object()之前调用了b.Object()

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