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

Is it correct to declare a dynamic array of atomic using double pointers in C++?

我需要创建一个原子整数数组,即 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] 是否都是原子的(除了用多线程检查它)?

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

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

如果这对你有用,那么

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

应该也可以,有一些不同,但最重要的可能是如果你按值传递 a1,内容不会被复制,但如果你传递 a2按价值计算,它们是。

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