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;
}
答
您的移动构造函数是错误的。它不会移动输入对象的数组来取得它的所有权,也不会设置正在构造的对象的任何数据成员。它应该看起来更像这个:
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;
}
您的移动构造函数实际上没有设置任何类成员,因此未来的操作可能会失败... –
是的。不过,我认为这不是问题 - 我的实施正是我的教授所建议的。 – BowmanBeric
@BowmanBeric那么你的教授是错的。或者你误解了告诉你的。 –