【问题标题】:Why does programm throws double free detected in tcache 2 while using single linked list为什么在使用单链表时在 tcache 2 中检测到程序会抛出双重释放
【发布时间】:2022-11-16 03:54:48
【问题描述】:

我正在尝试创建函数以从单链表中删除所有值小于下一个(后续)元素值的元素。出于某种原因,程序抛出“free():在 tcache 2 中检测到双重释放”。我的功能有什么问题? 列表不为空。

#include <iostream>
using namespace std;
struct Elem
{
    int num;
    Elem* next;
};

void deleteFromLinkedList(Elem* list) {
    Elem* curr, * next, *prev;
    curr = list;
    next = list->next;
    prev = NULL;
    while (next != NULL)
    {
        if (curr->num < next->num) {
            prev->next=next;
            delete curr;
            curr = prev;
            continue;
        }
        prev = curr;
        curr = next;
        next = curr->next;
    };
}

void printLinkedList(Elem* first) {
    Elem* p;
    for (p = first; p != NULL; p = p->next)
    {
        cout << p->num << " ";
    };
    cout << endl;
}
int main()
{
    Elem* first = NULL, * last = NULL, * p;
    int i;
    cout << "Enter number any number, 0 to finish";
    cin >> i;
    while (i != 0)
    {
        p = new Elem;
        p->num = i;
        p->next = NULL;
        if (first == NULL)
        {
            first = last = p;
        }
        else
        {
            last->next = p;
            last = last->next;
        };
        cout << "Enter number any number, 0 to finish";
        cin >> i;
    };

    printLinkedList(first);
    deleteFromLinkedList(first);
    printLinkedList(first);
}

【问题讨论】:

  • 示例:删除前:15,12,11,7,9,5,2,3 删除后:15,12,11,9,5,3
  • 请出示 minimal reproducible example - 您的错误可能已经从其他地方开始
  • 可能意味着您尝试删除同一个节点超过 1 次。
  • void deleteFromLinkedList(Elem* list) { 问题 #1 是按值而不是按引用将指针传递给头节点。这意味着即使 deleteFromLinkedList() 已正确实现,您也永远无法更新指向头 node 的指针。
  • 调试器。使用带笔和纸的调试器。在使用调试器遍历树时,使用笔和纸绘制节点和链接。

标签: c++ memory singly-linked-list alloc


【解决方案1】:

您的代码存在许多问题。

next = list-&gt;next;未定义的行为如果列表为空(即list 为空)。

prev-&gt;next=next;未定义的行为对于列表中的第一个节点,prev 未分配。

delete'ing 它指向的节点之后,您没有更新 curr,这也是未定义的行为.

正在传入list指针按价值,因此如果列表中的第一个节点被释放,调用者的指针将无法更新,因为调用者将留下一个指向无效内存的悬空指针。

试试这个:

void deleteFromLinkedList(Elem* &list) {

    if (!list)
        return;

    Elem *curr = list, *next = list->next, *prev = NULL;

    while (next)
    {
        if (curr->num < next->num) {
            if (prev)
                prev->next = next;
            else
                list = next;
            delete curr;
        }
        else {
            prev = curr;
        }
        curr = next;
        next = curr->next;
    }
}

Online Demo

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2022-01-05
    • 2021-12-19
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多