2017-09-19 4 views
-2

お願いします、私に慈悲を持ってください。私の任務は1時間で完了し、すべてが動作します - 私の人生のためにできないことを除いて、私の移動コンストラクター(そして、延長、​​私のコピー割り当て)がセグメンテーション違反を投げる理由を理解してください!C++:Movement Constructorがセグメンテーションフォルトを投げていますか?

補足情報:基本的に任意のデータ型の配列を格納するChainというデータ構造体を作成し、そのサイズのsize_tを作成します。

ご協力いただきありがとうございます。詳細情報が必要な場合はお知らせください。

// Copy-constructor. 
Chain(const Chain &rhs) { 
    size_ = rhs.size(); 
    array_ = new Object[size_]; 
    for (int i = 0; i < size_; i++) { 
     array_[i] = rhs.array_[i]; 
    } 
} 

// Copy-assignment. 
Chain& operator=(const Chain &rhs) { 
    Chain copy = rhs; 
    std::swap(*this, copy); 
    return *this; 
} 

// Move-constructor. 
Chain(Chain &&rhs) { 
    rhs.array_ = nullptr; 
} 
+0

移動コンストラクタは実際にクラスメンバーを設定しないため、将来の操作は失敗する可能性があります。 –

+0

True。私はそれがここの問題だとは思わないが、私の実装はまさに私の教授が提案したものであった。 – BowmanBeric

+0

@BowmanBericあなたの教授は間違っています。あるいは、あなたはあなたに告げられたことを誤解しました。 –

答えて

2

移動コンストラクタが間違っています。入力オブジェクトの配列を移動してその所有権を取得するのではなく、構築中のオブジェクトのデータメンバーを設定していません。

Chain(Chain &&rhs) { 
    size_ = rhs.size(); 
    array_ = rhs.array_; 
    rhs.array_ = nullptr; 
    rhs.size_ = 0; 
} 

代わり::それはより多くの代わりに次のようになりますサイドノートで

Chain(Chain &&rhs) : array_(nullptr), size_(0) { 
    std::swap(size_, rhs.size_); 
    std::swap(array_, rhs.array_); 
} 

それはコピーの割り当ての両方として機能し、移動割り当てをすることができますので、あなたの代入演算子を簡略化することができる。

Chain& operator=(Chain rhs) { 
    std::swap(*this, rhs); 
    return *this; 
} 
関連する問題