【发布时间】:2019-04-27 14:26:18
【问题描述】:
我正在实现一个 LinkedList。我可以重用我编写的公共函数来删除和释放析构函数中的节点(也包括内存),而不是重做工作。输出结果很好/正确,但我想知道我是否在幕后遗漏了任何东西。我见过this,但我主要关心的是我是否在释放 C++ 代码中的内存方面做得正确。
我的析构函数:
~LinkedList(){
Node *next = head;
while(head != NULL){
DeleteEndVal();
}
}
我的公共函数 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;
}
}
【问题讨论】:
-
我可以重复使用我编写的公共函数来删除和释放析构函数中的节点(也包括内存) -- 如果该函数有效,是的,你可以。但是如果你打算这样做,为什么不重复删除第一个值而不是删除最后一个值呢?删除最后一个值会导致性能损失,因为您必须一直遍历到最后。
-
@PaulMcKenzie 啊!你说的对。感谢您提出这个问题!
-
另一件需要注意的是你调用的函数,如果你要在析构函数中使用它,它不应该抛出异常,或者至少,确保没有异常从析构函数中逃脱。因此,您的析构函数需要确保异常不会从中逃脱,否则将调用
std::terminate。您可以通过多种方式确保这一点,但只是为了完善在析构函数中调用其他函数时必须注意的事项。
标签: c++ memory linked-list destructor singly-linked-list