在C++中访问未初始化的原子私有变量
问题描述:
认为我有下面的类:在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_
崩溃?
答
默认情况下,加载使用memory_order_seq_cst。看到这里:http://en.cppreference.com/w/cpp/atomic/memory_order。
正如评论中提到的,它不应该给你任何正常整数不会给出的问题。如果未初始化的初始值很大,您是否担心溢出?看到这里可能的后果:https://www.owasp.org/index.php/Integer_overflow
答
n_成员变量只是未初始化。访问该字段将导致在内存中读取,并且没有理由崩溃,尽管该8字节内存的布局未知。
成员是原子的事实在这里没有重要性。这将导致编译器不对这个特定的变量使用任何优化,并且还可能在每次写入时导致缓存行驱逐到RAM。
你有一个'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
是的,我有一个A的构造函数,它初始化A的其他变量但不初始化'n_' – user1715122 2014-12-02 08:33:07
@JoachimPileborg n_是默认初始化的,对象被构造,它的值是未指定的,所以它不是UB。 – Rost 2014-12-02 08:46:46