【问题标题】:Am I safely deleting a linked list?我是否安全地删除了链接列表?
【发布时间】:2013-08-07 05:59:07
【问题描述】:

只是想知道这个删除链表的实现是否有任何缺陷/不一致/内存泄漏:

// Function to delete the entire linked list
void deleteList(Node** head) {

    Node* current = *head;
    Node* next;

    while (current != 0) {

        next = current->next;
        delete current;
        current = next;

    }

    *head = 0;
}

编辑:

struct Node {

    int data;
    Node* next;
    Node(int data) : data(data){}

};

【问题讨论】:

  • 如果没有Node的定义,就很难肯定地回答这个问题
  • @TimothyJones:我会把你的“难”提高到“不可能”。
  • 如果head 无效,你会崩溃,否则看起来没问题(假设Node::next 总是正确初始化)。
  • 销毁int 显然不会抛出,但是如果您想将其推广到其他类型,那么在开始销毁节点之前,偏执并更新head 是值得的。如果数据析构函数抛出异常,您不希望在 head 中留下无效指针。

标签: c++ algorithm data-structures linked-list


【解决方案1】:

如果你通过引用而不是指针传递头指针,那将是更多的 C++:

void deleteList(Node * & head)
{
    // (...)

    head = nullptr; // NULL in C++ pre-11
}

另外,为了让代码更整洁,您可以在循环内移动next 的声明:

while (current != 0) 
{
    Node * next = current->next;
    delete current;
    current = next;
}

我唯一担心内存泄漏的问题是正确释放节点的内容,但是由于您存储了一个简单的 int,所以那里应该没有任何问题。

假设您的列表具有指向节点的有效指针并且头指针也有效,那么其他一切似乎都很好。

【讨论】:

  • 一般来说,我在删除之前有一个“如果当前!= this”,并标记一个错误以防万一。
  • 使用引用代替指针有什么好处?
  • @RSinghS 您不能传递空对象,不能传递立即值(左值),并且更明确地通知您的源代码阅读器,您要修改传递的变量(它不是 在指针的情况下很明显)。进一步阅读:stackoverflow.com/questions/7058339/…
猜你喜欢
  • 2012-10-16
  • 2022-10-05
  • 2020-11-21
  • 2010-10-07
  • 2013-12-25
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多