[英]Why is the order of destruction same as order of construction, with static object (C++)?
[英]Ensure the construction and destruction order of static variables in c++
我試圖找到一種確保靜態變量的構造和破壞順序的好方法。 據我所知,靜態變量是以下列方式構造和破壞的:
如果靜態變量在不同文件中定義了全局空間,則無法保證其構造順序。
但是,如果在函數中定義了靜態變量,則在第一次執行命中其聲明時構造局部靜態變量 。
基於上面的規則,我編寫了以下c ++代碼,以確保靜態變量b
總是在靜態變量a
之前被破壞,在我的實驗中確保構造順序和銷毀順序:
在檔案啊
class A {
public:
SomeClass* GetStatic() {
static SomeClass a;
return &a;
}
}
在文件Bh中:
#include "A.h"
class B {
public:
AnotherClass* GetStatic() {
A::GetStatic(); // a dummy call to force the static local variable in
// A::GetStatic() get initialized before the b.
static AnotherClass b;
return &b;
}
}
在上面的例子中,我放了一個虛擬調用A::GetStatic();
在聲明static AnotherClass b;
。 如果第3條成立,這將確保a
之前被初始化b
。 並且由於規則1,可以保證b
在a
之前被破壞。
我的問題是:
我還檢查了isocpp.org網站 ,以確保靜態變量的構造和銷毀順序的最佳方法,但該部分仍標記為TODO:WRITE THIS UP。
在您的情況下,您在第一次使用時使用構造,並且您的類的構造函數都不依賴於另一個。 因此,初始化的順序是保證A然后B.
在這種情況下,只要你有簡單的析構函數,就可以保證銷毀順序為B-> A. 這是一個更詳細的答案 。
可悲的是,你所做的目前是“最先進的”。
谷歌的另一個有用的技術:
#pragma init_seg(XXX)
- 適用於Windows下的MSVS和Intel C ++
__attribute__ ((init_priority(XXX))
- 適用於GCC和clang
另外,我必須警告你,你的本地static
技巧不是線程保存(至少在MSVC,Intel C ++,clang和gcc中),因為它是通過檢查和設置全局變量來實現的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.