我正在实现一个 LinkedList。我可以重用我编写的公共(public)函数来删除和释放析构函数中的节点(也是内存),而不是重做工作。输出结果很好/正确,但我想知道我是否遗漏了幕后的任何东西。我看过this但我主要担心的是我是否在释放 C++ 代码中的内存方面做得正确。
我的析构函数:
~LinkedList(){
Node *next = head;
while(head != NULL){
DeleteEndVal();
}
}
我的公共(public)函数 DeleteEndVal();:
// delete value from the end of the list
int DeleteEndVal(){
if(CheckListEmpty() == true){
cout << "Empty list. Nothing to delete." << endl;
return -1;
}
else{
int val;
Node *prev;
Node *cur;
if(head->next == NULL){
val = tail->data;
head = NULL;
tail = NULL;
}
else{
prev = head;
cur = head->next;
while (cur->next != NULL){
prev = prev->next;
cur = cur->next;
val = cur->data;
}
prev->next = NULL;
free(cur);
}
return val;
}
}
最佳答案
您可以在析构函数中调用函数,因此首先回答您最初的问题:是的,没关系。
还有其他几个方面:
首先,您不应该手动重新编写链表等基本概念。这是容易出错的和/或可能是低效的实现。请改用基础类或标准 C++ 库。
当坚持你的代码时,我想知道为什么:
- 在析构函数中有一个
Node *next = head;
。恕我直言,它什么都不做。 - 您似乎有一个
tail
属性。如果该方法正在删除尾部元素(可能将其重命名为DeleteTail
),则您不应遍历整个链表。相反,取尾部,获取其前一个元素(我假设您的链表是双向的),然后更新该链接。 - 因此,您当前的实现有一个嵌套的 while 循环来销毁列表,及时获取 n*n 的顺序。对于销毁用例,您甚至不需要更新元素,使用简单的 while 循环并在不重新链接的情况下销毁它们。
关于c++ - 我可以在析构函数中调用公共(public)函数来释放内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53472700/