gpt4 book ai didi

c++ - 我可以在析构函数中调用公共(public)函数来释放内存吗?

转载 作者:行者123 更新时间:2023-11-28 01:26:36 24 4
gpt4 key购买 nike

我正在实现一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com