全域性物件和全域性靜態 區域性靜態析構順序

2021-08-02 07:38:39 字數 1920 閱讀 3869

多久不用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 現用現定義...