【问题标题】:C++: Move Constructor throwing a segmentation fault?C ++:移动构造函数引发分段错误?
【发布时间】:2018-02-27 16:05:13
【问题描述】:

stackoverflow 的各位大神,请怜悯我。我的作业将在一小时后完成,一切正常——除了我一生无法弄清楚为什么我的移动构造函数(以及我的复制作业)会引发分段错误!

如果有帮助,请提供额外信息:该程序将创建一个称为 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;
}

【问题讨论】:

  • 您的移动构造函数实际上并没有设置任何类成员,因此未来的操作可能会失败...
  • 是的。不过,我认为这不是问题所在——我的实施正是我的教授建议的。
  • @BowmanBeric 那么你的教授错了。或者你误解了告诉你的内容。

标签: c++ constructor copy variable-assignment move


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2012-05-11
    相关资源
    最近更新 更多