多久不用c++ ,好多東西都模糊了,最近跟人討論全域性和靜態的析構順序,之前總覺得這個根據編譯器來決定的,其實還是有一定的說法的。
記錄一下:
class a destructor delete a;
class b destructor 區域性變數
class d destructor // 區域性靜態變數
class c destructor // 全域性變數。
結果顯示:確實是全域性變數比區域性靜態變數後析構。區域性靜態變數先析構,然後才是全域性變數。
那全域性靜態變數呢,他們應該與都在靜態儲存區啊?
經過測試,
static e e2;
c c;
int main()
class a destructor
class b destructor
class d destructor
class c destructor
class e destructor
///
c c;
static e e2;
int main()
class a destructor
class b destructor
class d destructor
class e destructor
class c destructor。
也就是全域性變數和全域性靜態變數,都是最後析構,這只是一次測試結果,想到之前對於全域性靜態在不同編譯器下初始化先後順序不同,這個析構順序也是偶然的。
也就是說,c++全域性靜態變數的析構銷毀順序是未定義的,特別是在多執行緒環境,多dll環境下,特別複雜,但是在某個編譯器下,析構順序是一定,按著構造的反順序析構,其他都是隨機,不確定的。
也可以這麼理解,==全域性變數和全域性靜態變數的析構順序也是未定義的==。
很明顯,區域性靜態變數在程式第一次使用的時候進行構造,構造時間較晚,就較早析構,比其他全域性變數或靜態變數析構的早。
//#include "stdafx.h"
#include
#include
#include
using namespace std;
#define d_out(x) \
cout << (x);\
ofstream outfile;\
outfile << (x) << endl;\
outfile.close();
class a
; a:: a()
a::~ a()
class b
; b::b()
b::~b()
class c
; c ::c ()
c ::~c ()
class d
; d::d()
d::~d()
class e
; e::e()
e::~e()
static e e2;
c c;
int main()
結果:
class
econstructor
class
cconstructor
class
aconstructor
class
bconstructor
class
dconstructor
class
adestructor
class
bdestructor
class
ddestructor
class
cdestructor
class
edestructor
C語言 全域性?靜態全域性?區域性?靜態區域性
全域性變數 儲存在靜態區,程式執行的整個過程一直占用記憶體。所有檔案所有函式都可以使用 使用extern宣告 比較靈活。正是因為多個地方都可讀可寫,是乙個很危險的事,因為不知道某個時刻誰會將它改變,而且導致程式不方便移植。適當使用全域性變數還是有很多好處的,只是不推薦濫用全域性變數 區域性變數 除了...
C 之全域性物件,區域性物件,靜態區域性物件
先說兩個概念 作用域 scope 和生命週期 lifetime 作用域 名字的作用域指的是知道該名字的程式文字區域 生命週期 物件的生命週期指在程式執行過程中物件存在的時間 全域性物件,顧名思義是全域性的物件,其作用域是整個程式文字,其物件的宣告週期是整個程式的執行過程 區域性物件 一般說的區域性變...
區域性物件與全域性物件的構造和析構
例程除錯,很多細節問題。可以單步除錯後,切入到反彙編進行觀察。include pch.h include include include include using namespace std namespace nmsp1 命名空間 a int m i void func a obja 現用現定義...