抛出异常:读取访问冲突,插入链表将不起作用 [重复]

Exception thrown: read access violation, Inserting linked list will not work [duplicate]

提问人:aditpatel 提问时间:11/2/2023 更新时间:11/2/2023 访问量:36

问:

我正在为我的链表类创建一个成员函数,该函数在单链表的第 n 个位置插入一个节点。我正在使用标准节点类。 每当我在 main.cpp 中运行代码时:

library.insert("I, Robot", "Isaac Asimov", 7);
library.insert("Brave New World", "Aldous Huxley", 0);
library.insert("Animal Farm", "George Orwell", 5);

我收到此错误:“抛出异常:读取访问冲突。beforeNode 已0xFFFFFFFFFFFFFFAF。

这是我的函数:

int LinkedList::insert(string title, string author, int position)
{
    if (position < 0 || position > size) {
        cout << "Not a valid insert -- out of range!\n";
        return 1;
    }
    else if (position == 0) {
        Node* newNode = new Node(title, author, head);
        head = newNode;
        delete newNode;
        size++;

    }
    else if (position == size) {
        append(title, author);
    }
    else {
        Node* beforeNode = head;
        
        for (int i = 0; i < position; i++) {
            beforeNode = beforeNode->next;
        }

        Node* newNode = new Node(title, author, beforeNode->next);
        beforeNode->next = newNode;


        delete newNode;
        delete beforeNode;
        size++;
    }

    return 0;
}

我尝试以不同的方式重写它,但它没有改变错误消息。

C++ 指针 链接列表

评论

3赞 Alan Birtles 11/2/2023
请举一个最小的可重复的例子。虽然不太可能带来好的结果。 销毁对象,而不是包含这些对象的指针变量head = newNode; delete newNodedelete
0赞 Pepijn Kramer 11/2/2023
从设计的角度来看,如果直接添加类似 .话虽如此,你的节点类是什么样子的,很可能是你忘记了初始化指向insert(string title, string author, int position)nullptr
0赞 Pepijn Kramer 11/2/2023
此外,这也是开始学习如何使用调试器的绝佳时间点。无论如何,这是一项你需要的技能,使用调试器,它会向你显示崩溃的位置和/或你可以逐行执行你的代码。你可以检查你所看到的是否与你期望发生的事情相同。
0赞 Pepijn Kramer 11/2/2023
还要确保将列表编译到一个单独的库中,并编写 2 个可执行文件,一个包含最终程序,另一个包含单元测试,您可以在各种场景中测试您的方法(特别是意外的,例如如果列表为空、有一个节点等会发生什么)。
0赞 drescherjm 11/3/2023
head = newNode; delete newNode;这是绝对不正确的。你摧毁了你设定的物体,使它成为一个悬空的指针,指向被释放的记忆。 与 GC 语言有很大不同,GC 语言有一个概念,只要它被引用,就会保留对象。在 c++ 中,没有进行引用计数。你告诉它摆脱头部指向的物体。c++new

答: 暂无答案