簡體   English   中英

確保c ++中靜態變量的構造和銷毀順序

[英]Ensure the construction and destruction order of static variables in c++

我試圖找到一種確保靜態變量的構造和破壞順序的好方法。 據我所知,靜態變量是以下列方式構造和破壞的:

  1. 靜態物體的破壞順序與其構造的順序相反

  2. 如果靜態變量在不同文件中定義了全局空間,則無法保證其構造順序。

  3. 但是,如果在函數中定義了靜態變量,則在第一次執行命中其聲明時構造局部靜態變量

基於上面的規則,我編寫了以下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,可以保證ba之前被破壞。

我的問題是:

  1. 我能否知道我所做的事情是否正確或在某些角落案件中可能出錯?
  2. 有沒有更好或最好的方法來確保靜態變量的構造或破壞順序?

我還檢查了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM