在 c++ 中访问未初始化的原子私有变量
Accessing uninitialized atomic private variable in c++
假设我有以下类:
class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}
private:
std::atomic<uint64_t> n_;
...
...
};
假设我初始化了类中的所有其他变量,除了n_
,并且这不是线程本地存储,因此没有零初始化。
我创建了一个类 A 的对象,并不断调用 incrementN()
。
如果在某个时候我想要n_
的值,并且我调用getN()
,这会导致原子n_
的load()
例程崩溃吗?
默认情况下
,负载使用memory_order_seq_cst。看这里:http://en.cppreference.com/w/cpp/atomic/memory_order。
正如评论中提到的,它不应该给你任何普通整数不会给你的问题。您是否担心如果未初始化的初始值很大,溢出?有关可能的后果,请参阅此处:https://www.owasp.org/index.php/Integer_overflow
n_成员变量只是未初始化。访问该字段将导致读取内存,并且没有理由崩溃,尽管该 8 字节内存的布局未知。
成员是原子的事实在这里并不重要。这将导致编译器不对此特定变量使用任何优化,还可能导致每次写入时缓存行逐出到 RAM。
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持