全局对象和全局静态、局部静态析构顺序

xiaoxiao2021-02-28  66

本文章由cartzhang编写,转载请注明出处。 所有权利保留。 文章链接:http://blog.csdn.net/cartzhang/article/details/72904337 作者:cartzhang

多久不用C++ ,好多東西都模糊了,最近跟人討論全局和靜態的析構順序,之前總覺得這個根據編譯器來決定的,其實還是有一定的說法的。 記錄一下:

1. 全局与静态对象析构的顺序

class A destructor delete a; class B destructor 局部变量 class D destructor // 局部静态变量 class C destructor // 全局变量。

结果显示:确实是全局变量比局部静态变量后析构。局部静态变量先析构,然后才是全局变量。

2.全局静态变量

那全局静态变量呢,他们应该与都在静态存储区啊?

经过测试,

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环境下,特别复杂,但是在某个编译器下,析构顺序是一定,按着构造的反顺序析构,其他都是随机,不确定的。 也可以这么理解,==全局变量和全局静态变量的析构顺序也是未定义的==。

3.为什么局部静态变量比全局先析构呢?

很明显,局部静态变量在程序第一次使用的时候进行构造,构造时间较晚,就较早析构,比其他全局变量或静态变量析构的早。

4.全部测试程序

// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> #include <fstream> using namespace std; #define D_Out(x) \ cout << (x);\ ofstream outfile;\ outfile.open("testDestructor.txt", std::ofstream::app);\ outfile << (x) << endl;\ outfile.close(); class A { public: A(); ~ A(); private: }; A:: A() { D_Out("class A constructor") } A::~ A() { D_Out("class A destructor") } class B { public: B(); ~B(); private: }; B::B() { D_Out("class B constructor") } B::~B() { D_Out("class B destructor") } class C { public: C (); ~C (); private: }; C ::C () { D_Out("class C constructor") } C ::~C () { D_Out("class C destructor") } class D { public: D(); ~D(); private: }; D::D() { D_Out("class D constructor") } D::~D() { D_Out("class D destructor") } class E { public: E(); ~E(); private: }; E::E() { D_Out("class E constructor") } E::~E() { D_Out("class E destructor") } static E e2; C c; int main() { A *a = new A(); B b; static D d; delete a; a = NULL; return 0; }

结果:

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

转载请注明原文地址: https://www.6miu.com/read-63375.html

最新回复(0)