C++:移动构造函数抛出一个分段错误?

问题描述:

请问,上层的*,怜悯我。我的任务是在一个小时内完成的,而且一切正常 - 除了我无法理解为什么我的移动构造函数(以及扩展名,我的复制分配)引发了分段错误!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那么你的教授是错的。或者你误解了告诉你的。 –

您的移动构造函数是错误的。它不会移动输入对象的数组来取得它的所有权,也不会设置正在构造的对象的任何数据成员。它应该看起来更像这个:

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