错误 C6011:取消引用空指针"NAME"。C++
Error C6011:Dereferencing NULL pointer 'NAME'. C++
正如标题中一样,我的代码给出了上述警告并混合了内存引用。 我的任务是在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
中实现析构函数,以便在销毁List
时delete
中的所有节点。
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);
}
}
}
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- C++中"dependent name"的定义是什么?
- 将系数存储在头文件的数组中("does not name a type"错误)
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- C++初学者:为什么我的编译器根据我的循环返回"name not found"?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 在 C++ 中使用命名空间时出现"does not name a type"错误
- 已声明时"Does not name a type"错误
- 嵌套类"does not name a type"
- C++ "Using Uninitialized Memory.. (variable name) "
- 在反转字符串'my.name.is'时,我得到的输出为"is@.name.my"。我不明白'@'是从哪里来的
- C++错误:"class name"之前的预期类型说明符
- C++从"NameBase"类到模板"Name"类的相互关系的成语(或模式)
- 错误 C6011:取消引用空指针"NAME"。C++
- 无法构建 RcppArmadillo.package.skeleton 测试包:"R_init_"的多重定义<name>
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 为什么 std::locale( " " ).name() 在 clang 和 gcc 上给出不同的结果?
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?