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