簡體   English   中英

C ++靜態成員初始化順序

[英]C++ static member initialization order

我有一個已經使用了很長時間的代碼,它的場景如下。

有兩個類, AB

A類有一個公共靜態變量static B* pB;

B類本身具有一個靜態對象( static B instance; )。

B構造函數中,我設置A::pB = this;

我的問題是,因為靜態變量的初始化順序是不確定的,所以如果b::instanceA::pB之前被初始化,則使B構造函數首先被調用,並且它會嘗試設置尚未初始化的A::pB ,這可能導致一個問題?

我當前的代碼運行沒有任何意外行為。 想知道這是否只是我的運氣

A::pBB::instance初始化發生在不同的翻譯單元中)

初始化分為三個部分:零初始化,靜態初始化和動態初始化。 (零初始化實際上是靜態初始化的一部分,但將它們分開通常很方便。)它們以該順序發生。

如果您沒有為static B* A::pb;指定任何初始化static B* A::pb; ,它將被初始化為零(之前沒有任何其他操作),並且別無其他。 如果指定常量初始化器,例如

B* A::pb = nullptr;

,這也將在任何動態初始化之前發生。

構造函數中發生的是動態初始化,因此,除非A::pb也具有動態初始化(例如A::pb否則您的代碼應該沒有問題。

B* A::pb = someFunctionReturningABStar();

最后:指針的默認構造函數很簡單; 在加載程序之前,在執行任何代碼之前,指針實際上是“構造的”。 因此,由於在構造函數中分配給pB永遠不會有問題。 如果存在指針的動態初始化,那么可能會發生唯一的問題,這可能是在B::instance的構造函數中賦值並覆蓋它之后發生的。

當然,在構造B::instance之前,其他任何代碼都將在A::pb看到空指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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