【问题标题】:Bus error: 10 in C++ while implementing singly linked list总线错误:C++ 中的 10 在实现单链表时
【发布时间】:2016-07-19 21:36:41
【问题描述】:

我正在尝试在 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 变量和指针的方式有问题,任何见解都将不胜感激。

【问题讨论】:

  • 你在 List::append 中取消引用 newnode 而没有先分配节点。
  • 您应该考虑提高警告级别。此外,在您理解并纠正您的代码后,您应该使用 std::forward_list 或仅使用 std::vector
  • 谢谢,我刚刚查找了如何分配结构,它起作用了。似乎我最初试图通过另一个线程上的解决方案来解决这个问题,但没有意识到这是关于分配一个类对象而不是一个结构。
  • 一个类对象而不是一个结构。在 c++ 中,除了默认可见性之外,这些是相同的。
  • 类对象分配看起来像'ListNode newnode = new ListNode()',而结构分配看起来像'ListNode *newnode = new ListNode'。对吗?

标签: c++ pointers bus-error


【解决方案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。

【讨论】:

  • 谢谢,你是对的,这样代码更简洁,更易于维护。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2015-10-30
相关资源
最近更新 更多