【问题标题】:Can I call a public function in a destructor to free memory?我可以在析构函数中调用公共函数来释放内存吗?
【发布时间】: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


【解决方案1】:

你可以在你的析构函数中调用一个函数,所以首先回答你原来的问题:是的,没关系。

还有其他几个方面:

首先,您不应手动重新编码链表之类的基本概念。这是容易出错和/或可能是低效的实现。请改用基础类或标准 C++ 库。

在坚持你的代码时,我想知道为什么:

  • 在析构函数中有一个Node *next = head;。恕我直言,它什么也没做。
  • 你似乎有一个tail 属性。如果该方法正在删除尾部元素(可能将其重命名为DeleteTail),那么您不应该遍历整个链表。相反,取尾部,获取其前一个元素(我假设您的链表是双向的),然后更新该链接。
  • 因此,您当前的实现有一个嵌套的 while 循环来销毁列表,时间顺序为 n*n。对于销毁用例,您甚至不需要更新元素,只需使用简单的 while 循环即可销毁它们而无需重新链接。

【讨论】:

  • 1) 我删除了 Node *next = head;它似乎对输出没有任何影响。 2)我的链表是单独的。我想我会按照上面 Paul 的建议用头部删除它。 3)你是对的。让我看看如何重写和优化它。谢谢托马斯!
猜你喜欢
  • 2016-10-25
  • 2011-10-12
  • 2014-11-12
  • 2013-01-04
  • 1970-01-01
  • 2020-05-25
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多