实现单链表时,C++中的总线错误:10

Bus error: 10 in C++ while implementing singly linked list

本文关键字:总线 错误 C++ 单链表 链表 实现      更新时间:2023-10-16

我正试图在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 );

并且可以省略接下来的2行。这将使您的代码更加干净,并防止使用未初始化的数据创建ListNode实例。

注意N2:由于类List有一个原始指针和数据所有权,所以应该遵循三条规则,创建或禁用copy-ctor、赋值运算符和dtor。