在c ++中访问未初始化的原子私有变量

时间:2014-12-02 08:25:10

标签: c++ stdatomic

假设我有以下课程:

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

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

};

假设我初始化了类中的所有其他变量,除了n_并且这不是线程本地存储,因此没有零初始化。

我创建了A类的对象,并继续调用incrementN()

如果在某些时候我想要n_的值,并且我调用getN(),这是否会导致原子load()的{​​{1}}例程崩溃?

2 个答案:

答案 0 :(得分:0)

默认情况下,加载使用memory_order_seq_cst。见这里:http://en.cppreference.com/w/cpp/atomic/memory_order

正如评论中所提到的那样,它不应该给你任何正常注意力不能给予的问题。如果未初始化的初始值很大,您是否担心溢出?请参阅此处了解可能的后果:https://www.owasp.org/index.php/Integer_overflow

答案 1 :(得分:0)

n_成员变量刚刚未初始化。访问该字段将导致内存中的读取,并且没有理由崩溃,尽管该8字节内存的布局未知。

这个成员是原子的事实在这里并不重要。这将导致编译器不对此特定变量使用任何优化,并且还可能导致每次写入时将高速缓存行驱逐到RAM。