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

标签 c++ memory linked-list destructor singly-linked-list

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

相关文章:

c++ - 用c++构建和生成带有循环的一副纸牌

c++ - 如何使用 MSP432 DriverLib'c C 代码编写 C++ ISR?

ios - Unwind segue (D->B) 不释放 C

python - 如何在python中读取大型压缩文件而不将其全部加载到内存中

c++ - 链表C++中的内存地址

c++ - 我试图通过 espeak 传递一些字符串,它会读取它们,但我得到 "segmentation fault"

c++ - 使用静态 openssl 1.1.1a 编译静态 curl

memory - 谷歌云平台 : how to monitor memory usage of VM instances

C 链表纸牌游戏并由于 fatal error 而得到奇怪的结果

c++ - 有序链表抛出异常(写访问冲突)