2014-12-02 106 views
5

認爲我有下面的類:在C++中訪問未初始化的原子私有變量

class A 
{ 
public: 
... 
... 
void incrementN() {++n_;} 
uint64_t getN() {return n_;} 

private: 
std::atomic<uint64_t> n_; 
... 
... 

}; 

假設我初始化類中的所有其他變量,除了n_並且這不是線程本地存儲,所以沒有零初始化。

我創建了一個類A的對象,並且一直呼叫incrementN()

如果在某些時候,我想的n_的價值,我打電話getN(),可這導致load()例程原子n_崩潰?

+0

你有一個'A'的默認構造函數,或者任何'A'構造函數嗎?如果你沒有任何構造函數或缺省構造函數('A()= default;'),那麼編譯器生成的默認構造函數將調用所有非靜態成員的默認構造函數([reference](http:// en .cppreference.com/w/cpp/language/default_constructor))和['std :: atomic'默認構造函數](http://en.cppreference.com/w/cpp/atomic/atomic/atomic)將會調用。 – 2014-12-02 08:29:39

+0

是的,我有一個A的構造函數,它初始化A的其他變量但不初始化'n_' – user1715122 2014-12-02 08:33:07

+0

@JoachimPileborg n_是默認初始化的,對象被構造,它的值是未指定的,所以它不是UB。 – Rost 2014-12-02 08:46:46

回答

0

n_成員變量只是未初始化。訪問該字段將導致在內存中讀取,並且沒有理由崩潰,儘管該8字節內存的佈局未知。

成員是原子的事實在這裏沒有重要性。這將導致編譯器不對這個特定的變量使用任何優化,並且還可能在每次寫入時導致緩存行驅逐到RAM。