C ++ List中的分段错误

时间:2015-12-18 14:14:48

标签: c++ list segmentation-fault

我想创建一个自己的List类,每个节点都有一个值(double)。在我将一个节点添加到列表后,我想获得列表的正确长度(1),但它只是显示我"分段错误"在我的Node :: getNext()方法。

这是我的代码:

#include <iostream>
#include <cassert>

using namespace std;

class List{
private:
    class Node{
    public:
        Node(double value){
            this->value = value;
            this->setNext(nullptr);
        }
        Node* getNext(){
            return next;
        }
        void setNext(Node* myNode){
            this->next = myNode;
        }

    private:
        double value;
        Node* next;
    };

    Node *head;

public:
    List(){
        head = nullptr;
    }

    int length(){
        int length = 0;
        if (head == nullptr)return length;
        else{
            Node *pointer = head;
            do {
                pointer = pointer->getNext();
                length++;
            } while (pointer->getNext() != nullptr);
        }
        return length;
    }

    void pushback(double value){
        if (head == nullptr)head = new Node(value);
        else{
           lastNode()->setNext(new Node(value));
        }
    }

    Node* lastNode(){
        Node* end = head;
        while(end->getNext() != nullptr){
            end = end->getNext();
        }
        return end;
    }
};

class TestList{
public:
    void run(){
        testListConstructor();
        testAddOneNodeToList();
        //testAddSecondNodeToList();
    }

private:
    void testListConstructor(){
        List myList;
        assert(0 == myList.length());
    }

    void testAddOneNodeToList(){
        List myList;
        myList.pushback(1.5);
        assert(1 == myList.length());
    }

    void testAddSecondNodeToList(){
        List myList;
        myList.pushback(1.5);
        cout << myList.lastNode();
        myList.pushback(2.5);
        assert(2 == myList.length());
    }
};

int main(void){
    TestList tl;
    tl.run();
    cout << "Main-Function abgearbeitet" << endl;

    return 0;
}

我在getNext方法中出错了什么?为什么我会出现分段错误?

2 个答案:

答案 0 :(得分:1)

由于您曾致电pointer,因此必须检查nullptrlen = 0; curr = head while (curr != nullptr) { ++len; curr = curr.next } 是否属于您的行动条款。

或者只是做一些事情:

public partial class Child : Form
    {
        public event DatabaseChangeHandler DatabaseChanged;
        public delegate void DatabaseChangeHandler(string newDatabaseName);

        public Child()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //When the database changes
            if (this.DatabaseChanged != null)
            {
                this.DatabaseChanged("The New Name");
            }
        }
    }

答案 1 :(得分:1)

你在这里使用了nullptr

Node *pointer = head;
do{
    pointer = pointer->getNext(); \\ (1)
    length++;
}while (pointer->getNext() != nullptr);

当您已到达最终列表节点时,(1)之后pointer的值将为nullptr