3

次のおもちゃのプログラムを考えてみましょう( prog.cpp):

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;
}

これは正常にコンパイルされた場合 ( g++ prog.cpp -latomic)、正常に動作します。ただし、コンパイルするとg++ -fsanitize=address -fno-omit-frame-pointer prog.cpp -latomic、実行時に Double Free エラーが生成されます。上記と同様の行に基づくプログラムは、通常のコンパイルでも Double Free エラーが発生するマルチスレッド アプリケーションで使用する必要があります。Double Free の場合に一般的に参照される Rule of Three/Five やその他のさまざまなドキュメントを読みましたが、何も機能しませんでした。

noexceptまた、のデフォルトコンストラクタから指定子を削除するclass Aと、この奇妙なエラーが発生します。これについても知りたいです。

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;
   ^
4

1 に答える 1

4

std::atomicタイプのメンバー(eg)は自明にコピー構築可能ではないため、自明にコピー可能な型が必要です。Avector<int>

バージョン 5.0 以降、GCC はその要件の違反のみを検出します。

古い gcc バージョンがコードをコンパイルするという事実は、それが有効であることを意味しません。

于 2016-10-08T20:44:32.360 に答える