2

a = b のようなことをすると問題なく動作しますが、a = a を実行すると、ベクトル内のすべての要素に対して -1.255 +-67 になります。これは私のコピー コンストラクターと代入演算子です。

VecXd(const VecXd &source){
    dimension = source.dimension;
    vector = new T[dimension];
    for(int i=0; i < dimension; i++)
        vector[i] = source.vector[i];
}

VecXd operator=(const VecXd &source){
    dimension = source.dimension;
vector = new T[dimension];
for(int i=0; i < dimension; i++)
    vector[i] = source.vector[i];
return *this;
}
4

5 に答える 5

3

2 つのベクトルが同じ場合、この行はソース ベクトルの内容を消去します。

vector = new T[dimension];

したがって、コピー ループが発生する次の行では、ガベージをガベージに読み込んでいます。本当に安全な代入演算子/コピー コンストラクターには、copy-swap パターンを使用します

于 2013-09-18T00:21:15.490 に答える
1

簡単な答え:vectorポインターをオーバーライドし、データを失います (そしてメモリ リークを起こします)。

代入演算子を実装する最も簡単な方法は、コピー アンド スワップ イディオムです。

void swap(VecXd & other) {
    using std::swap;
    swap(dimension,other.dimension);
    swap(vector,other.vector);
}

VecXd& operator=(const VecXd &source){
    VecXd cpy (source);
    swap(cpy);
    return *this;
}

これは次の理由で適切な選択です。

  • 自己割り当ては自動的に機能します
  • 余分なものは必要ありませんdelete
  • 後で他のメンバーをクラスに追加する場合は、コピー コンストラクターを調整するだけで済みます。

スワップ演算子がスローしない場合 (当然のこと)、これにより強力な例外安全性が保証されます。つまり、代入演算子が (コピー コンストラクターを介して) スローした場合、オブジェクトの状態は変更されません。

于 2013-09-18T01:03:34.857 に答える