错误C6011:取消引用NULL指针“ NAME”。 C ++

与标题中的代码一样,我的代码给出上述警告并混搭内存引用。 我的任务是在C ++中使用嵌套类。这段代码主要是我的代码,用于以前的C应用程序中的链表,但针对C ++进行了重新制作。 我已经在互联网上搜索了有关NULL异常的信息,但无法弄清。 我会发布代码,希望有人能给我一些提示。 在Internet上的各种链接和技巧中,它表示我指向的指针是指向NULLptr的,并且不能访问NULL地址。 试图以各种形式对其进行审查,但这是行不通的。

标题

#ifndef LIST_H
#define LIST_H

#include <iostream>
#include <math.h>
using namespace std;

class List
{
private:
    class Node {
    public:
        int data;
        Node* next;
        Node() {
            this->data = NULL;
            this->next = NULL;
        }
    };
    Node* head;
public:
    List();
    void insertList(int data);
    void deleteFromList(int data);
    void deleteLowerThan(int lower);
    void calculateArithmetic();
    void showList();
};

#endif

Cpp文件


List::List() {
    this->head = NULL;
}

void List::insertList(int n) {
    Node* new_node = new Node();


    new_node->data = n;

    new_node->next = head;

    head = new_node;

}

void List::deleteFromList(int n) {
    Node* temp = head;
    Node* prev = NULL;

    if (temp != NULL && temp->data == n) {
        head = temp->next;
        return;
    }

    while (temp->data != n && temp != NULL) {
        prev = temp;
        temp = temp->next;
    }

    if (temp == NULL) return;

    prev->next = temp->next;
}

void List::deleteLowerThan(int n) {
    Node* temp = head;
    while (temp != NULL) {
        if (temp->data < n) {
            deleteFromList(temp->data);
        }
        else {
            temp = temp->next;
        }
    }
}

void List::showList()
{
    Node* temp = head;
    while (temp != NULL)
    {
        cout << temp->data << " ";
        temp = temp->next;
    }
}

驱动程序



int main() {
    List lista;
    lista.insertList(2);
    lista.insertList(4);
    lista.insertList(6);
    lista.insertList(8);
    lista.insertList(3);
    lista.insertList(1);
    lista.insertList(-4);
    lista.showList();
    lista.deleteFromList(4);
    lista.showList();
    lista.deleteFromList(8);
    lista.showList();
    lista.deleteFromList(6);
    lista.showList();
    lista.deleteLowerThan(3);
    lista.showList();

    return 0;
}
zmm22 回答:错误C6011:取消引用NULL指针“ NAME”。 C ++

问题出在您的deleteFromList函数中,代码如下:

while (temp->data != n && temp != NULL) {
//...

在这里,您正在尝试检查temp->data是否为temp之前的NULL 的值。因此,在某些时候(当您位于列表的末尾,并且temp NULL时,将取消引用空指针-这不好!

相反,只需反转比较的顺序即可:

while (temp != NULL && temp->data != n) {
//...

通过这种方式,一旦tempNULL,比较的结果将完全为人所知(请参阅short circuiting),temp->data 不为 被评估,该循环将停止运行。

,

正如阿德里安(Adrian)和安迪(Andy)所指出的那样,此行导致temp在引用之前被取消引用。

NULL

因此,只需先检查它是否不是while (temp->data != n && temp != NULL) ,然后 取消引用即可。

其他可提及的问题是内存泄漏。每个NULL都应该只有一个delete(除非您将指针移交给可以为您做new的智能指针)。

delete

void List::deleteFromList(int n) { Node* temp = head; Node* prev = head; // set this if you need to delete head if(temp != nullptr && temp->data == n) { head = prev->next; delete prev; // you forgot this return; } while(temp != nullptr && temp->data != n) { prev = temp; temp = temp->next; } if(temp == nullptr) return; prev->next = temp->next; delete temp; // you forgot this } 被销毁时,您还需要在List中实现析构函数以delete的所有节点。

您的List函数中存在一个棘手的错误。您遍历列表中的节点并调用deleteLowerThan(),这将删除您当前所在的节点。在下一次迭代中,您将在deleteFromList()中使用相同的节点指针,从而导致未定义的行为。就我而言,该程序似乎永远挂起。

一个可能的解决方法:

if (temp->data < n) {
本文链接:https://www.f2er.com/3054930.html

大家都在问