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

本文章由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

猜你喜欢

转载自blog.csdn.net/cartzhang/article/details/72904337