错误 C6011:Dereferencing 空指针 'NAME'。 C++

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

如标题所示,我的代码给出了上述警告并混搭了内存引用。 我的任务是在 C++ 中使用嵌套 类。这段代码主要是我以前的 C 应用程序的链接列表代码,但为 C++ 重新制作。 我已经在互联网上搜索过有关 NULL 异常的信息,但我无法弄清楚。 我会 post 代码,希望有人能给我一些提示。 在 Internet 上的各种链接和提示中,它说我指向的指针正在引用 NULLptr,并且它不能访问 NULL 地址。 尝试过各种形式的复习,都没有用。

Header

#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;
    }
}

Driver



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->data 的值,然后 您已验证是否 tempNULL。因此,你会在某个时候(当你在列表的末尾时,并且 temp NULL 取消引用空指针 - 这是不错!

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

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

这样,一旦tempNULL,比较的结果就会完全已知(参见short circuiting),temp->data 被计算,循环将停止运行.

正如 Adrian 和 Andy 所指出的,这一行导致 temp 被取消引用 你检查它是否是 NULL:

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中实现一个析构函数来delete销毁List中的所有节点。

您的 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);
        }
    }
}