抛出异常:写访问冲突。 temp 为 nullptr

Posted

技术标签:

【中文标题】抛出异常:写访问冲突。 temp 为 nullptr【英文标题】:Exception thrown: write access violation. temp was nullptr 【发布时间】:2020-01-06 05:24:12 【问题描述】:

我在else 语句中的insert() 函数中遇到错误。

这是结构:

struct Node

    int data;
    Node* next;
;
Node* head = NULL;

这里是函数:

void insert(int data)

    Node* New = new Node();
    if (head == NULL)
    
        New->data = data;
        head = New;
    
    else
    
        // down here where the error occured
        Node* temp = new Node();
        temp = head;
        while(temp != NULL)
        
            temp = temp->next;
        
        temp->data = data;
        temp->next = New;
    

【问题讨论】:

【参考方案1】:

你的循环:

while(temp != NULL)

temp 等于nullptr 时终止(请注意,您最好在C++ 中使用此常量而不是NULL)并在该循环之后立即取消引用temp。同样没有任何理由将new 的结果分配给temp 并立即将其释放到下一行代码(导致内存泄漏)。而且您应该始终将data 分配给新项目,而不是temp(假设是最后一项)您的逻辑应该是这样的:

void insert(int data)

    Node* New = new Node();
    New->data = data;     // note you better do these 2 lines in constructor
    New->next = nullptr; 
    if (head == nullptr)
    
        head = New;
        return;
    
    Node* temp = head; 
    while( temp->next != nullptr ) // look for the last item
        temp = temp->next; 
    temp->next = New;

【讨论】:

然后代码可以大大简化:void insert(int data) Node **temp = &head; while (*temp) temp = &((*temp)->next); *temp = new Nodedata, nullptr; @RemyLebeau 同意,但这对于 OP 来说可能太复杂了,看起来指针不是他的强项,这里甚至是指向指针的指针。

以上是关于抛出异常:写访问冲突。 temp 为 nullptr的主要内容,如果未能解决你的问题,请参考以下文章

抛出异常:写访问冲突。 _My_data 为 0x7001AC

抛出异常:写访问冲突 C++

抛出未处理的异常:写访问冲突。 bunnies_array 是 0x5CB3CBA

抛出异常:读取访问冲突。 **bp** 为 0xFFFFFFFFFFFFFFFF

抛出异常:读取访问冲突。 **dynamicArray** 为 0x1118235。发生了

为啥这段代码会抛出访问冲突异常?