总线错误:在C ++中实现单链表时为10

时间:2016-07-19 21:36:42

标签: c++ pointers bus-error

我试图从头开始用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 变量和指针的方式有问题,任何见解都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

在这一行:

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:因为您的班级List有一个原始指针和数据的所有权,您应该遵循rule of three并创建或禁用复制ctor,赋值运算符和dtor。