我的移动分配操作程序重载的分段错误

Segmentation fault with my Move assignment opertaor overloading

本文关键字:分段 错误 重载 程序 移动 分配 操作 我的      更新时间:2023-10-16

注意:这个问题中的程序已经发现了错误,我重新排列了问题的内容。如果您有类似的问题,这篇文章将建议您不仅检查移动赋值运算符,还检查析构函数。

首先,我们可以看到图像以了解下面类的数据结构。 在此处输入图像描述

.h

class List{
public:
// Destructor
~List();
// default constructor
List();
// move assignment operator
List& operator=(List&& src);
private:
Node* lead; ///boundary sentinel: dummy head  
Node* new_dummy_head();

};

.cc

// Destroctors
List::~List(){
Node* cur = lead->next;
Node* nex = cur->next;
while(cur->data!=NULL){
delete cur;
cur = nex;
nex = nex->next;
}
delete lead;
}
// default constructors (just create a dummy node)
List::List(){
lead = new_dummy_head();
}
// move assignment operator overloading
List& List::operator=(List&& src){
// Release any resources *this owns and Reset *this
// not the point of question, hide it
// pilfer src
lead = src.lead;
// Reset source object
src.lead = NULL;
return *this;
}
Node* List::new_dummy_head(){
Node* ptr = new Node;
cerr << ptr->data << endl;
ptr->prev = ptr->next = ptr;
return ptr;
}

main.cc

int main()
{
List beta;
beta = List();
return 0;
}

然后得到

segmentation fault

在这个程序中,List 的析构函数假设有一个虚拟节点由lead指向,但我们可以看到在移动赋值运算符的定义中

// Reset source object
src.lead = NULL;
return *this;

它设置了右值对象 NULL 的lead,因此在销毁移自对象时将是分段错误