2017-09-19 209 views
-2

請問,上層的stackoverflow,憐憫我。我的任務是在一個小時內完成的,而且一切正常 - 除了我無法理解爲什麼我的移動構造函數(以及擴展名,我的複製分配)引發了分段錯誤!C++:移動構造函數拋出一個分段錯誤?

附加信息是否有幫助:程序是創建一個稱爲鏈的數據結構,它基本上存儲任何數據類型的數組,以及大小爲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

是的。不過,我認爲這不是問題 - 我的實施正是我的教授所建議的。 – 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; 
}