在我的C++链表实现中取消引用节点指针,给出意想不到的结果



我正在根据第一原则在C++中实现一个无序列表。我的(到目前为止部分完成(实现是:

#include <iostream>
class Node {
    int m_data;
    Node *m_next;
public:
    Node(int data)
    {
        m_data = data;
        m_next = nullptr;
    }
    int getData() { return m_data; }
    void setData(int data) { m_data = data; }
    Node* getNext() { return m_next; }
    void setNext(Node *next) { m_next = next; }
};
class UnorderedList {
public:
    Node *m_head;
public:
    UnorderedList()
    {
        m_head = nullptr;
    }
    bool isEmpty() { return m_head == nullptr; }
    void appendToHead(int data)
    {
        Node temp = Node(data);
        temp.setNext(m_head);
        m_head = &temp;
    }
    void remove(int data);
    bool search(int data);
};
int main()
{
    UnorderedList list1;
    list1.appendToHead(32);
    list1.appendToHead(47);
    list1.appendToHead(90);
    std::cout << list1.m_head->getData() << 'n';
    std::cout << list1.m_head->getNext()->getData() << 'n';
    return 0;
}

我能够正确地将列表的头部打印为"90",但下一行(即getNext((->getData(((被打印为一个大的随机数(281314120(。这是什么原因呢?

void appendToHead(int data)
{
    Node temp = Node(data);
    temp.setNext(m_head);
    m_head = &temp;
}

切勿存储具有自动存储持续时间的对象地址。当该方法完成时appendToHead该对象(在本例中为 temp (将不复存在。

您这样做并调用了未定义的行为。您可能想执行以下操作:

void appendToHead(int data)
{
    Node* temp = new Node(data);
    temp->setNext(m_head);
    m_head = temp;
}

您还应该考虑满足五法则

除了原始指针之外,还探索std::unique_ptr的使用。

最新更新