[英]C++ static member initialization order
我有一個已經使用了很長時間的代碼,它的場景如下。
有兩個類, A
和B
A
類有一個公共靜態變量static B* pB;
B
類本身具有一個靜態對象( static B instance;
)。
在B
構造函數中,我設置A::pB = this;
我的問題是,因為靜態變量的初始化順序是不確定的,所以如果b::instance
在A::pB
之前被初始化,則使B
構造函數首先被調用,並且它會嘗試設置尚未初始化的A::pB
,這可能導致一個問題?
我當前的代碼運行沒有任何意外行為。 想知道這是否只是我的運氣
( A::pB
和B::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.