如何将对象的实例分配给null的指针?

时间:2013-12-11 15:35:43

标签: c++ class object pointers null

代码:

#include <iostream>

using namespace std;

class Node {
    public:
        Node *next;
        int value;
        Node(int value) {
            this->next = nullptr;
            this->value = value;
        }
};

class LinkedList {
    private:
        Node *head;
        Node *tail;
    public:
    LinkedList() {
        this->head = nullptr;
        this->tail = nullptr;
    }

    void addToEnd(int value) {
        if(head == nullptr)
            this->head = new Node(value);
        else
            this->tail->next = new Node(value);
        this->tail = this->tail->next;
    }

    void print() {
        for(Node *n = this->head; n != nullptr; n = n->next)
            cout<<n->value<<" ";
        cout<<endl;
    }
};

int main() {
    LinkedList *list = new LinkedList();

    list->addToEnd(21);
    list->addToEnd(25);
    list->addToEnd(56);
    list->addToEnd(24);
    list->print();

    return 0;
}

我的问题是,当我将Node的实例分配给this->head时,程序崩溃了。是否有不同的方法将实例分配给最初为nullptr的指针?

这个代码结构在Java上运行良好,我来自Java,这就是我在C ++指针上遇到困难的原因。

修改

我现在粘贴了正确的代码,我确定。遗憾。

好的,我已经解决了这个问题。因此,问题不在于将对象分配给类成员,而是问题是访问nullptr成员:this->tail

我编辑了这个方法,程序现在以我想要的方式运行。

void addToEnd(int value) {
    Node *n = new Node(value);
    if(head == nullptr)
        this->head = n;
    else
        this->tail->next = n;
    this->tail = n;
}

感谢您的帮助,这个问题现在已经解决了。 :)

2 个答案:

答案 0 :(得分:2)

我不知道“崩溃”,但以下行无效:

this->head = Node(value);

head是指向Node的指针,但您尝试为其分配Node。即使这会自动获取您在RHS上创建的临时地址(它没有),您也会指向一个长期不存在的局部变量。

您应该收到编译错误。

您必须使用new动态创建新对象 - 请务必编写代码以便以后释放该内存!

您同样在main中搞乱了动态内存分配,在那里您有不必要的内存泄漏。 LinkedList list;会在那里做得很好。

答案 1 :(得分:0)

您需要为Node个实例分配内存。最快捷的方法是在new Node(value)的任何地方致电Node(value)。但是如果我是你,我会考虑使用shared_ptr<Node>而不是普通的指针。