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之外,您还想通过赋值运算符定义实现什么?任何合理的赋值运算符都会使操作数保持与源对象相同的状态,那么为什么要在主体中创建新的对象实例,而不是赋值当前实例的数据成员呢?您确定要创建从中指定的源对象的副本吗?