C++11 块作用域与全局作用域中静态对象的生命周期结束
在这段关于程序退出的文章中 如果线程本地或静态对象A的构造函数或动态初始化的完成顺序在线程本地或静态对象B之前,则B的销毁完成顺序在A的销毁开始之前 “之前排序”是什么意思 特别是这个节目,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
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()