c++ - 在 C++ 中使用双指针声明原子的动态数组是否正确?

标签 c++ c++11 vector atomic pointer-to-pointer

我需要创建一个原子整数数组,即 n 个整数,每个整数都是原子的。我发现 std::vector<std::atomic<int>>将不起作用,但后来我尝试了以下方法并使用 clang 成功编译。

int n;
std::cin >> n;
std::atomic<int> **a;
a = new std::atomic<int>* [n];
for(int i = 0; i < n; i++)
{
    a[i] = new std::atomic<int>();
}

我不确定这样做是否正确,是吗?此外,是否有任何方法可以验证是否所有 a[i][0]在这里将是原子的(除了用多线程检查它)?

最佳答案

您的代码是正确的(除了资源泄漏,我假设为简洁起见省略了销毁数组),但很复杂。首先,为什么要使用“双指针”或指向指针的指针?为什么不是这个:

std::atomic<int> * a1 = new std::atomic<int>[ n ];

如果这对你有用,那么

std::vector<std::atomic<int>> a2( n );

也应该工作,有一些区别,但最重要的可能是如果你按值传递 a1,内容不会被复制,但如果你传递 a2 按值,它们是。

这对您来说可能是个问题,因为 std::atomic 不可复制。所以你应该总是通过引用传递a2,除非你需要转移所有权;在那种情况下使用 std::move 和右值引用。您不能按值传递 a2

关于c++ - 在 C++ 中使用双指针声明原子的动态数组是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40672229/

相关文章:

c++ - 在 if-else if 链中使用 Likely()/Unlikely() 预处理器宏

c++ - 如何迭代 std::tuple 的元素?

c++ - 读取C++中数据类型为Class的.dat文件,然后将每一行存储在Class类型的vector中

c++ - 创建以 vector/列表迭代器为键的 map

c++ - 具有零参数的模板说明符

c++ - C和C++中的全局变量有什么区别?

c++ - 在 C# 中向 hwnd 发送消息

c++ - 用什么代替 std::map::emplace?

c++ - 主流 C++ 编译器中 GC 实现的时间表是什么?

c++ - 在 C++ std::vector 构造函数中使用十六进制 0xdeadbeef