Bus error: 10 in C++ while implementing singly linked list
Bus error: 10 in C++ while implementing singly linked list
我正在尝试从头开始用 C++ 自己实现一个单链表,到目前为止我的第一个方法 append():
#include <iostream>
using namespace std;
struct ListNode{
int key_value;
ListNode *next;
};
class List{
public:
List();
void append(int key);
private:
ListNode *head;
ListNode *tail;
};
List::List(){
head = NULL;
tail = head;
}
void List::append(int key){
ListNode *newnode;
newnode->key_value = key;
newnode->next = NULL;
if(head == NULL){
head = newnode;
tail = head;
}
else{
tail->next = newnode;
tail = newnode;
}
return;
}
int main(){
try{
List l1;
l1.append(1);
//l1.append(2);
//l1.append(3);
//l1.append(5);
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
}
}
编译时没有任何警告或错误,但在执行过程中我只收到消息 Bus error: 10
。似乎我初始化和使用 ListNode 变量和指针的方式有问题,任何见解都将不胜感激。
这一行:
ListNode *newnode;
您创建指向 ListNode
的指针的未初始化变量,然后取消引用它。对未初始化变量的任何访问都会导致 UB,但是使用指针你很可能会立即得到总线错误。所以分配内存:
ListNode *newnode = new ListNode;
注意:不是初始化数据成员:
newnode->key_value = key;
newnode->next = NULL;
你应该为 ListNode
:
提供合适的构造函数
struct ListNode {
int key_value;
ListNode *next;
ListNode( int v ) :
key_value( v ),
next( nullptr )
{
}
};
然后创建它:
ListNode *newnode = new ListNode( key );
接下来两行可以省略。这将使您的代码更清晰,并防止使用未初始化的数据创建 ListNode
实例。
注意 N2:由于您的 class List
具有原始指针和数据所有权,您应该遵循 rule of three 并创建或禁用复制构造函数、赋值运算符和 dtor。
我正在尝试从头开始用 C++ 自己实现一个单链表,到目前为止我的第一个方法 append():
#include <iostream>
using namespace std;
struct ListNode{
int key_value;
ListNode *next;
};
class List{
public:
List();
void append(int key);
private:
ListNode *head;
ListNode *tail;
};
List::List(){
head = NULL;
tail = head;
}
void List::append(int key){
ListNode *newnode;
newnode->key_value = key;
newnode->next = NULL;
if(head == NULL){
head = newnode;
tail = head;
}
else{
tail->next = newnode;
tail = newnode;
}
return;
}
int main(){
try{
List l1;
l1.append(1);
//l1.append(2);
//l1.append(3);
//l1.append(5);
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
}
}
编译时没有任何警告或错误,但在执行过程中我只收到消息 Bus error: 10
。似乎我初始化和使用 ListNode 变量和指针的方式有问题,任何见解都将不胜感激。
这一行:
ListNode *newnode;
您创建指向 ListNode
的指针的未初始化变量,然后取消引用它。对未初始化变量的任何访问都会导致 UB,但是使用指针你很可能会立即得到总线错误。所以分配内存:
ListNode *newnode = new ListNode;
注意:不是初始化数据成员:
newnode->key_value = key;
newnode->next = NULL;
你应该为 ListNode
:
struct ListNode {
int key_value;
ListNode *next;
ListNode( int v ) :
key_value( v ),
next( nullptr )
{
}
};
然后创建它:
ListNode *newnode = new ListNode( key );
接下来两行可以省略。这将使您的代码更清晰,并防止使用未初始化的数据创建 ListNode
实例。
注意 N2:由于您的 class List
具有原始指针和数据所有权,您应该遵循 rule of three 并创建或禁用复制构造函数、赋值运算符和 dtor。