在我的C ++链接列表实现中取消引用节点指针会产生意外结果

时间:2017-03-18 12:02:40

标签: c++ pointers

我基于第一原则在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;
}

我可以正确打印列表的标题为&#39; 90&#39;,但是下一行(即getNext() - &gt; getData())会被打印为一个大的随机数(281314120) 。这是什么原因?

1 个答案:

答案 0 :(得分:1)

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

永远不要使用automatic storage duration存储对象的地址。当temp方法完成时,该对象(在这种情况下,appendToHead)将不复存在。

您这样做并调用了未定义的行为。你可能想这样做:

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

您还应该考虑满足The Rule Of Five

而不是原始指针,另外探讨std::unique_ptr的使用。