本文章由cartzhang编写,转载请注明出处。 所有权利保留。 文章链接:http://blog.csdn.net/cartzhang/article/details/72904337 作者:cartzhang
多久不用C++ ,好多東西都模糊了,最近跟人討論全局和靜態的析構順序,之前總覺得這個根據編譯器來決定的,其實還是有一定的說法的。 記錄一下:
class A destructor delete a; class B destructor 局部变量 class D destructor // 局部静态变量 class C destructor // 全局变量。
结果显示:确实是全局变量比局部静态变量后析构。局部静态变量先析构,然后才是全局变量。
那全局静态变量呢,他们应该与都在静态存储区啊?
经过测试,
static E e2; C c; int main() { A *a = new A(); B b; static D d; delete a; a = NULL; return 0; }class A destructor class B destructor class D destructor class C destructor class E destructor
/// C c; static E e2; int main() { A *a = new A(); B b; static D d; delete a; a = NULL; return 0; }class A destructor class B destructor class D destructor class E destructor class C destructor。
也就是全局变量和全局静态变量,都是最后析构,这只是一次测试结果,想到之前对于全局静态在不同编译器下初始化先后顺序不同,这个析构顺序也是偶然的。
也就是说,C++全局静态变量的析构销毁顺序是未定义的,特别是在多线程环境,多dll环境下,特别复杂,但是在某个编译器下,析构顺序是一定,按着构造的反顺序析构,其他都是随机,不确定的。 也可以这么理解,==全局变量和全局静态变量的析构顺序也是未定义的==。
很明显,局部静态变量在程序第一次使用的时候进行构造,构造时间较晚,就较早析构,比其他全局变量或静态变量析构的早。
结果:
class E constructor class C constructor class A constructor class B constructor class D constructor class A destructor class B destructor class D destructor class C destructor class E destructor【1】https://stackoverflow.com/questions/469597/destruction-order-of-static-objects-in-c 【2】http://www.cnblogs.com/to-be-st/archive/2012/12/08/2808408.html