错误 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
的值,然后 您已验证是否 temp
是 NULL
。因此,你会在某个时候(当你在列表的末尾时,并且 temp
是 NULL
取消引用空指针 - 这是不错!
相反,只需颠倒比较顺序:
while (temp != NULL && temp->data != n) {
//...
这样,一旦temp
为NULL
,比较的结果就会完全已知(参见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);
}
}
}
如标题所示,我的代码给出了上述警告并混搭了内存引用。 我的任务是在 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
的值,然后 您已验证是否 temp
是 NULL
。因此,你会在某个时候(当你在列表的末尾时,并且 temp
是 NULL
取消引用空指针 - 这是不错!
相反,只需颠倒比较顺序:
while (temp != NULL && temp->data != n) {
//...
这样,一旦temp
为NULL
,比较的结果就会完全已知(参见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);
}
}
}