如何在类中删除C++(这样它就不会进入无限循环)


  • 我很差地实现了一个双重链表,我遇到了一个内存泄漏问题。
  • 最大的问题是我需要删除在堆中动态分配内存的节点。
  • 当double_linked_list类的remove函数出现时,将进入一个无限循环调用。
class double_node{
public:
// Data members
ll data;
double_node * next;
double_node * prev;
// Functions
double_node(){
this->next = nullptr;
this->prev = nullptr;
this->data = LLONG_MIN;
}
double_node(ll data, double_node * next, double_node * prev){
this->data = data;
this->next = next;
this->prev = prev;
}
// WARNING : Memory Leak
// I don't know why defining a destructor gives an error
~double_node(){
cerr << "~double_node() is calledn";
if(this != nullptr){
delete this;
}
}
};
class double_linked_list{
public:
double_node * head = new double_node;
double_node * tail = new double_node;
double_linked_list(){
// Head part
head->data = LLONG_MIN;
head->next = tail;
head->prev = nullptr;
// Tail part
tail->data = LLONG_MIN;
tail->next = nullptr;
tail->prev = head;

}
void append(ll data){
if(head->data == LLONG_MIN){
head->data = data;
}
else if(tail->data == LLONG_MIN){
tail->data = data;
}
else{
double_node * temp = tail;
double_node * last = new double_node;

// Setting up last
last->data = data;
temp->next = last;
last->prev = temp;
last->next = nullptr;
tail = last;
}

}
void remove(ll data){
double_node * temp = head;
while(temp != nullptr and temp->data != data){
temp = temp->next;
}
if(temp->data == data){
double_node * y = temp->prev;
double_node * x = temp;
double_node * z = temp->next;
if (z != nullptr){
z->prev = y;
}
if(y != nullptr){
y->next = z;
}
if(x == head){
head = z;
}
if(temp != nullptr){
x->next = nullptr;
x->prev = nullptr;
delete x;
}
}
}
};

如何在c++类中删除这个(这样它就不会进入无限循环)

不删除this。永远不要在析构函数中这样做。几乎没有理由在任何函数中这样做。

完全移除~double_node。该节点不拥有任何资源,因此不需要用户定义析构函数。

我遇到了一个内存泄漏问题。

您需要定义在节点上循环并删除它们的~double_linked_list。你还需要遵循5.

您的delete this在这里递归地调用自己。

~double_node(){
cerr << "~double_node() is calledn";
if(this != nullptr){
delete this;
}
}

你可以直接删除这个析构函数。

如http://www.cplusplus.com/reference/new/operator%20delete/

所述

带有delete操作符的表达式,首先调用适当的析构函数(对于类类型),然后调用一个释放函数。

你可以在某些情况下使用delete this,但你应该知道你在做什么。这里有一些建议:https://isocpp.org/wiki/faq/freestore-mgmt删除这个

此外,您应该在退出remove函数中的while循环后检查temp是否为null。否则,当它试图删除一些它找不到的东西时,它会出现分段故障。

最新更新