C++ AddressSanitizer GCC 4.8的双自由错误

C++ AddressSanitizer GCC 4.8的双自由错误,c++,gcc,atomic,noexcept,address-sanitizer,C++,Gcc,Atomic,Noexcept,Address Sanitizer,考虑以下玩具程序(prog.cpp): std::atomic需要一个类型,而您的a不是,因为它的类型vector(例如)的成员不是可复制构造的 较旧的gcc版本编译代码并不意味着代码是有效的。gcc 6.2.1产生以下诊断:“在实例化'struct std::atomic/static assertion failed:std::atomic时需要一个可复制的类型”。^^^@πάνταῥεῖ 我大致明白你的意思,但双重自由与此有什么关系呢?@ibrahim5253不是。也许是你问自己为什么?

考虑以下玩具程序(
prog.cpp
):


std::atomic
需要一个类型,而您的
a
不是,因为它的类型
vector
(例如)的成员不是可复制构造的


较旧的gcc版本编译代码并不意味着代码是有效的。

gcc 6.2.1产生以下诊断:“在实例化'struct std::atomic/static assertion failed:std::atomic时需要一个可复制的类型”。^^^@πάνταῥεῖ 我大致明白你的意思,但双重自由与此有什么关系呢?@ibrahim5253不是。也许是你问自己为什么?@Eichhnchen是的。但是我能够编译代码,Ubuntu 14.04。所以这里的问题是向量被简单地复制,而不是正确地复制构造函数,所以多个向量都有指向同一堆内存的指针?@ruakh。我没有在libstdc++中研究std::atomic的实现,但是我能够复制double-free,开发人员可能认为memcpy或类似的东西在这种情况下总是可以的。@Eichhörnchen那么解决方法是什么呢?我想要的只是
a
中的一个容器,那么有没有可以复制的容器?@ibrahim5253除了数组之外,std::atomic中可能没有任何容器。你想用它做什么?@Eichhörnchen阵列怎么可能?当使用动态分配的数组时(因为大小在运行时是可用的),我是否需要编写自定义的复制构造函数、赋值和析构函数(三大类),使类再次变得非常重要?
class A {
public:
    vector<int> vec;
    A() noexcept {}
    A(vector<int> s) : vec(s) {}
};

class B {

private:
    vector<atomic<A>> a_table;

public:
    B(int capacity) : a_table(capacity) {}

    void update(int index) {
        A newValue(vector<int>(10,1));
        a_table[index].store(newValue);
    }
};


int main(int argc, char** argv) 
{
B b(5);
b.update(2);
return 0;
}
error: function ‘std::atomic<_Tp>::atomic() [with _Tp = A]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘std::atomic<A>::atomic()’
   atomic() noexcept = default;
   ^