我的LinkedList赋值运算符有什么问题?

时间:2014-12-02 20:58:01

标签: c++

这会引发分段错误。

LList<T>& LList<T>::operator=(LList s){

    LList<T> final_list;
    final_list.head_ = s.head_;
    Node<T> *f_curr_node = final_list.head_;
    Node<T> *s_curr_node = s.head_;

    for (int x=0; x<s.length();x++){
        f_curr_node->next_ = s_curr_node->next_; 
    }

    return final_list;
}

我不明白为什么这会错误/如何修复它。

2 个答案:

答案 0 :(得分:4)

您正在返回对局部变量的引用。一旦操作员功能结束,该变量就会超出范围并被破坏。如果有人试图使用返回的内容,他将访问未分配的内存。

此修复后此代码存在许多其他问题,但这很可能是导致您崩溃的问题。

答案 1 :(得分:1)

正如其他人所指出的那样,您将返回对局部变量的引用,这是一种未定义的行为。

由于您通过值传递赋值运算符中的对象,这表示您已为链接列表类编写了工作副本构造函数和析构函数。如果复制构造函数和析构函数不能正常工作或没有完成,那么即使在return语句之前,您的代码也会被破坏。

但是,如果我们假设您的复制构造函数和析构函数已实现,正常工作且没有错误,则可以使用以下方法编写赋值运算符:

LList<T>& LList<T>::operator=(LList s){
    std::swap(s.head_, head_);
    std::swap(s.length, length);
    // swap out any other members
    return *this;
}

我不知道你的其他成员变量,所以你也需要交换它们。基本上我们所做的就是获取你通过值传递的列表(同样,这只有在你的拷贝构造函数工作时才有效),并用当前对象换出s的内部。然后当s死亡时(这就是为什么你必须有LList的工作析构函数),它会接受旧数据,而新数据则位于this

然后我们返回*this,这是您在初始尝试时应返回的内容,而不是对本地变量的引用。

查找用于编写赋值运算符的copy/swap习语。