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

标签 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;
}

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

最佳答案

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

永远不要用 automatic storage duration 存储对象的地址.当 appendToHead 方法完成时,该对象(在本例中为 temp)将不复存在。

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

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

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

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

关于c++ - 在我的 C++ 链表实现中取消引用节点指针给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42874161/

相关文章:

C++ 分析和优化

c++ - Jgrasp C++ 编译问题

C++:将派生指针转换为void指针,然后转换为抽象指针,并访问成员函数

c++ - 在这种情况下,可以避免在c++中手动管理内存吗?

c - 链表元素在 for 循环中更新不佳

c - char *a[]= {"hello", "world"}; 之间有什么区别?和 char a[][10]= {"hello", "world"};?

c++ - 设置 AD 标志时获取 "The security ID structure is invalid"

c++ - 如何实现自己的混合功能?

C++ 引用和解引用

c - 函数返回类型和指针