C++链表赋值运算符
C++ linked List assignment Operator
正在尝试为单个链表构建赋值运算符 class。我以为我构建正确,但仍然存在内存泄漏。
class 由第一个和最后一个变量组成。然后是一个Node结构。
节点结构如下所示:
struct node
{
TYPE value;
node * next;
node * last;
};
我的赋值运算符是这样的,它仍然有内存泄漏
queue& queue::operator=(const queue &rhs){
if(this == &rhs ){
node *ptr = first;
node *temp;
while(ptr != NULL){
temp = ptr;
ptr = ptr->next;
delete temp; // release the memory pointed to by temp
}
delete ptr;
} else{
if (rhs.first != NULL ) {
first = new node(*rhs.first);
first->next = NULL;
last = first;
// first-> value = v.first->value; // copy constructor should have done that
node *curr = first;
node *otherCur = rhs.first;
node *ptr = first;
node *temp;
while(ptr != NULL){
temp = ptr;
ptr = ptr->next;
delete temp; // release the memory pointed to by temp
}
while(otherCur->next != NULL){
curr->next = new node(*otherCur->next);
curr->next->next = NULL;
last = curr->next;
// curr->next->value = otherCur->next->value;
curr = curr->next;
otherCur = otherCur->next;
}
// curr->next = NULL;
}
}
return *this;
}
编辑:
复制构造函数(工作):
// copy constructor
queue::queue(const queue &v){
if (v.first != NULL ) {
first = new node(*v.first);
first->next = NULL;
last = first;
// first-> value = v.first->value; // copy constructor should have done that
node *curr = first;
node *otherCur = v.first;
while(otherCur->next != NULL){
curr->next = new node(*otherCur->next);
curr->next->next = NULL;
last = curr->next;
// curr->next->value = otherCur->next->value;
curr = curr->next;
otherCur = otherCur->next;
}
// curr->next = NULL;
}
}
工作析构函数:
queue::~queue(){
node *ptr = first;
node *temp;
while(ptr != NULL){
temp = ptr;
ptr = ptr->next;
delete temp; // release the memory pointed to by temp
}
}
.H文件的成员变量:
private:
// fill in here
node * first;
node * last;
如果您有一个有效的复制构造函数和析构函数,则可以使用 copy / swap
轻松实现赋值运算符,而不是所有这些代码。
#include <algorithm>
//...
queue& queue::operator=(const queue& v)
{
queue temp(v);
std::swap(temp.first, first);
std::swap(temp.last, last);
return *this;
}
基本上所做的就是通过使用复制构造函数创建一个临时副本。然后 this
的成员与临时成员交换。然后在最后,临时文件将被释放(析构函数),并带走旧数据。
我知道与您的尝试相比,代码很小,但它解决了其他人在评论中指出的所有问题,增加了异常安全性等,最重要的是,它有效。
但请记住,您必须有一个有效的、无错误的复制构造函数和析构函数(此外,您的复制构造函数必须不能使用赋值运算符,不幸的是,许多不知情的程序员都在这样做)。此外,您必须交换所有成员变量,因此如果您向 queue
class 添加更多成员变量,则需要为每个新变量添加一个 swap
。
参见 this for information on the copy / swap idiom。
正在尝试为单个链表构建赋值运算符 class。我以为我构建正确,但仍然存在内存泄漏。
class 由第一个和最后一个变量组成。然后是一个Node结构。
节点结构如下所示:
struct node
{
TYPE value;
node * next;
node * last;
};
我的赋值运算符是这样的,它仍然有内存泄漏
queue& queue::operator=(const queue &rhs){
if(this == &rhs ){
node *ptr = first;
node *temp;
while(ptr != NULL){
temp = ptr;
ptr = ptr->next;
delete temp; // release the memory pointed to by temp
}
delete ptr;
} else{
if (rhs.first != NULL ) {
first = new node(*rhs.first);
first->next = NULL;
last = first;
// first-> value = v.first->value; // copy constructor should have done that
node *curr = first;
node *otherCur = rhs.first;
node *ptr = first;
node *temp;
while(ptr != NULL){
temp = ptr;
ptr = ptr->next;
delete temp; // release the memory pointed to by temp
}
while(otherCur->next != NULL){
curr->next = new node(*otherCur->next);
curr->next->next = NULL;
last = curr->next;
// curr->next->value = otherCur->next->value;
curr = curr->next;
otherCur = otherCur->next;
}
// curr->next = NULL;
}
}
return *this;
}
编辑:
复制构造函数(工作):
// copy constructor
queue::queue(const queue &v){
if (v.first != NULL ) {
first = new node(*v.first);
first->next = NULL;
last = first;
// first-> value = v.first->value; // copy constructor should have done that
node *curr = first;
node *otherCur = v.first;
while(otherCur->next != NULL){
curr->next = new node(*otherCur->next);
curr->next->next = NULL;
last = curr->next;
// curr->next->value = otherCur->next->value;
curr = curr->next;
otherCur = otherCur->next;
}
// curr->next = NULL;
}
}
工作析构函数:
queue::~queue(){
node *ptr = first;
node *temp;
while(ptr != NULL){
temp = ptr;
ptr = ptr->next;
delete temp; // release the memory pointed to by temp
}
}
.H文件的成员变量:
private:
// fill in here
node * first;
node * last;
如果您有一个有效的复制构造函数和析构函数,则可以使用 copy / swap
轻松实现赋值运算符,而不是所有这些代码。
#include <algorithm>
//...
queue& queue::operator=(const queue& v)
{
queue temp(v);
std::swap(temp.first, first);
std::swap(temp.last, last);
return *this;
}
基本上所做的就是通过使用复制构造函数创建一个临时副本。然后 this
的成员与临时成员交换。然后在最后,临时文件将被释放(析构函数),并带走旧数据。
我知道与您的尝试相比,代码很小,但它解决了其他人在评论中指出的所有问题,增加了异常安全性等,最重要的是,它有效。
但请记住,您必须有一个有效的、无错误的复制构造函数和析构函数(此外,您的复制构造函数必须不能使用赋值运算符,不幸的是,许多不知情的程序员都在这样做)。此外,您必须交换所有成员变量,因此如果您向 queue
class 添加更多成员变量,则需要为每个新变量添加一个 swap
。
参见 this for information on the copy / swap idiom。