这会引发分段错误。
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;
}
我不明白为什么这会错误/如何修复它。
答案 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
习语。