Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的LinkedList赋值运算符有什么问题?_C++ - Fatal编程技术网

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

C++ 我的LinkedList赋值运算符有什么问题?,c++,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.le

这会引发分段错误

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

我不明白为什么会出错/如何修复。

您正在返回对局部变量的引用。一旦运算符函数结束,该变量就会超出范围并被销毁。如果有人试图使用返回的内容,他将访问未分配的内存


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

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

由于您在赋值运算符中按值传递对象,这表示您已经为链表类编写了一个工作副本构造函数和析构函数。如果复制构造函数和析构函数未工作或未完成,那么立即,您的代码甚至在返回语句之前就被破坏了

但是,如果我们假设您的复制构造函数和析构函数都已实现、正常工作并且没有bug,那么下面是编写赋值运算符的一种更简单的方法:

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提供一个工作的析构函数,它将与旧数据一起使用,而新数据则位于其中

然后我们返回*这个,这是您在初始尝试中应该返回的,而不是对局部变量的引用


查找用于编写赋值运算符的复制/交换习惯用法

请至少提供一个。除了下面的答案中解释的明显UB之外,您还想通过赋值运算符定义实现什么?任何合理的赋值运算符都会使操作数保持与源对象相同的状态,那么为什么要在主体中创建新的对象实例,而不是赋值当前实例的数据成员呢?您确定要创建从中指定的源对象的副本吗?