2015-10-15 27 views
3

代碼在i7-4790處理器(x86-64)上的VC++ 2013(v120)下編譯時沒有問題。爲什麼商店原子unique_ptr導致崩潰?

int main() 
{ 
    std::atomic<std::unique_ptr<int>> p; 
    p.store(std::make_unique<int>(5)); 
} 

一旦main()回報,我得到一個崩潰:

表達:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

這是怎麼回事?

+0

什麼編譯器和庫版本?什麼CPU架構? –

+0

@BenVoigt VC++ 2013(v120)CPU:i7-4790處理器(x86-64) – user2296177

回答

11

你不能用std::unique_ptr實例化std::atomiccppreference

的std ::原子可以與任何類型TriviallyCopyable T.性病被實例化::原子既不是可複製也不移動。

而一個std::unique_ptr不TriviallyCopyable

類滿足MoveConstructibleMoveAssignable要求,但也不CopyConstructibleCopyAssignable的要求。

你可以使用一個std::shared_ptr,它具有free functions defined to allow you to have atomic stores and loads

+0

感謝您的回答。那麼我是否正確地認爲這裏的問題是VC++ 2013沒有針對'std :: atomic '對靜態類型'T'進行靜態斷言? – user2296177

+2

我不認爲有任何要求它檢查'T'是否TriviallyCopyable – NathanOliver

+0

@ user2296177我不認爲這是一個錯誤,因爲標準調用'T'必須* TriviallyCopyable *所以你的負擔是你給它一個正確的類型。 – NathanOliver