【问题标题】:Linked List destructor without head?没有头的链表析构函数?
【发布时间】:2020-07-19 07:41:41
【问题描述】:

我被困在班级的链表析构函数上。这就是我这里的:

LinkedList::~LinkedList()
{
    LinkedList *forward = nullptr;
    LinkedList *current = this;
    //iterate through list, deleting each element as we go
    while (current != nullptr)
    {
            //set next pointer to current's next
            forward = current->next;
            delete current; //delete the current memory
            current = forward; //reset current to next's pointer
    }
}

当我运行它时,我得到一个段错误。我只想从我的链表中删除一个节点。那可能吗?另外,我没有像以前从其他列表中那样获得“头”指针,所以我使用了“this”,这行得通吗?

Aka - .cpp 在链表中找到要删除的位置,重新组织它周围的下一个指针,然后删除节点(调用此析构函数)

(当我用一个空的析构函数运行我的程序时,它打印出来很好,但当然有内存泄漏)

感谢任何帮助!

【问题讨论】:

  • 从上面的代码中可以清楚地看出您将列表节点与列表本身混淆了。您调用LinkedList 的类实际上是一个列表节点。通常要实现一个链表,您将有两个类,一个用于节点,一个用于整个列表。列表类管理节点,这就是您在上面尝试做的事情,但是由于混淆,您弄错了。

标签: c++ list


【解决方案1】:

根据定义 delete 调用 LinkedList::~LinkedList,因此由于循环调用 delete em>,因此您可以访问具有未定义行为的已删除元素

只是做

LinkedList::~LinkedList()
{
   if (next != nullptr)
     delete next;
}

或者只是

LinkedList::~LinkedList()
{
   delete next; // delete on nullptr does nothing
}

就个人而言,我更喜欢先与 nullptr 进行比较

【讨论】:

    【解决方案2】:

    我同意布鲁诺。

    此外,当你想删除一个节点并且你没有指向头的指针时,你需要一个双链表。

    双链表有两个指向它的上一个节点和下一个节点的指针。

    当你需要删除一个节点时,像这样:

    ListNode* p;
    if(p->pre)
        p->pre->nxt = p->nxt;
    if(p->nxt)
        p->nxt->pre = p->pre;
    p->nxt = p->pre = NULL;
    delete p;
    

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 2013-03-18
      • 2013-04-26
      • 2013-09-12
      • 2012-10-15
      • 2018-03-27
      • 2016-12-08
      • 2014-05-27
      相关资源
      最近更新 更多