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

How to assign an instance of an object to a pointer that was null?

本文关键字:null 指针 分配 实例 对象      更新时间:2023-10-16

代码:

#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;
}

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

我不知道"它崩溃了",但以下行无效:

this->head = Node(value);

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

你应该得到一个编译错误。

您必须使用new动态创建一个新对象—以后一定要写代码来释放内存!

类似地,main中的动态内存分配也会出现混乱,会出现不必要的内存泄漏。LinkedList list;会做得很好。

您需要为Node实例分配内存。最快的方法是无论你在哪里打Node(value),都要打new Node(value)。然而,如果我是你,我会考虑使用shared_ptr<Node>,而不是纯指针。