is compare_exchange_weak for std::shared_ptr broken in msvs
is compare_exchange_weak for std::shared_ptr broken in msvs 2013?
请看样本
std::atomic < std::shared_ptr < int > > a;
std::shared_ptr < int > b;
std::shared_ptr < int > c = std::make_shared < int > (10);
while(a.compare_exchange_weak(b, c));
assert(a.load() == c);
assert(a.load().use_count() == 2); // <- assertion is failed.
你觉得怎么样?是编译器错误吗?
在 win32 模式下使用 msvs 2013 生成
您的程序表现出未定义的行为。
29.5/1 有一个泛型类模板
atomic<T>
。模板参数的类型T
应该是简单的可复制的(3.9)。
shared_ptr<int>
不是普通的可复制的。
根据伊戈尔的回答,std::atomic<std::shared_ptr<T>>
没有定义的行为。您需要使用非成员shared_ptr
原子函数重载,如原子访问 [util.smartptr.shared.atomic] shared_ptr
中所述C++ §20.7.2.5 中所述。
std::shared_ptr < int > a;
std::shared_ptr < int > b;
std::shared_ptr < int > c = std::make_shared < int > (10);
while(std::atomic_compare_exchange_weak(&a, &b, c))
;
assert(std::atomic_load(&a) == c);
assert(std::atomic_load(&a).use_count() == 2);
在我看来,奇怪的是,该标准没有要求通过这些功能实现template <typename T> struct std::atomic<shared_ptr<T>>
的部分专业化。
我在Microsoft的<memory>
标头文档中没有看到非成员原子重载,因此它们可能不会在VS2013中实现。
问题是关于 C++11 但值得指出的是,自 C++20 以来,OP 代码是有效的,因为shared_ptr
和unique_ptr
都有专门的std::atomic
。
请参阅:在 cpp 首选项std::atomic<std::shared_ptr<T>>
此外,使用 std::atomic_compare_exchange
的替代方法已在 C++20 中弃用。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理