错误 C6011:取消引用空指针"NAME"。C++

Error C6011:Dereferencing NULL pointer 'NAME'. C++

本文关键字:NAME C++ 空指针 引用 C6011 取消 错误      更新时间:2023-10-16

正如标题中一样,我的代码给出了上述警告并混合了内存引用。 我的任务是在C++中使用嵌套类。这段代码主要是我以前 C 应用程序中链表的代码,但为C++重新制作。 我已经在互联网上搜索了有关所述 NULL 异常的信息,但我无法弄清楚。 我会发布代码,希望有人能给我一些提示。 在互联网上的各种链接和提示中,它说我指向的指针引用了一个 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;
}

问题出在您的 deleteFromList 函数中,使用以下代码:

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

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

相反,只需颠倒比较的顺序:

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

这样,一旦temp NULL,比较的结果将是完全已知的(参见短路(,temp->data不会被评估,循环将停止运行。

正如Adrian和Andy所指出的,在你检查它是否NULL之前,这条线会导致temp被取消引用:

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

因此,只需先检查它是否未NULL然后取消引用它。

其他值得一提的问题是内存泄漏。对于每个new,您应该只有一个delete(除非您将指针交给将为您执行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中实现析构函数,以便在销毁Listdelete中的所有节点。

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

一种可能的解决方法:

void List::deleteLowerThan(int n) {
    Node* temp = head;
    int tmpdata;
    while(temp != nullptr) {
        tmpdata = temp->data; // save the nodes data
        temp = temp->next;    // step before you delete
        if(tmpdata < n) {
            deleteFromList(tmpdata);
        }
    }
}