初始化原子指针原子?如果初始化或内存分配抛出会发生什么?

use*_*270 6 c++ c++11 c++14

如果我一次声明并定义一个原子指针 -

std::atomic<int*> iptr = new int(1);    
std::atomic<T*> iptr = new T();
Run Code Online (Sandbox Code Playgroud)

据我所知,整个操作不是原子的.

new T()涉及分配内存,构造T对象,然后将其原子分配给iptr.T可以是简单的可构造的,在这种情况下,构造T不应该抛出但是一些用户定义的T MAY抛出.

如果在T构造或内存分配之间某些其他线程使用iptr怎么办?

这个操作真的是原子的吗?使其成为原子的一种方法是打破声明和定义,例如

T* temp = new T();
std::atomic<T*> iptr = temp;    
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以原子地做同样的事情吗?我的理解有缺陷吗?

Sto*_*ica 6

new T() 涉及分配记忆,

是.

构造T对象

是.

然后它将自动分配给iptr.

完全(几乎,它是这里使用的对象的地址).它用于在内存分配和构造完成初始化原子.

T可能是简单的可构造的,在这种情况下,构造T不应该抛出但是一些用户定义的TMAY抛出.

如果确实如此,则不会达到原子的初始化.该new如果c'tor抛出表达不泄漏内存,它调用适当的deallcoation功能.因此,您的临时和直接使用新表达式具有完全相同的语义.