头文件中的 C++ 链表正在重置内存存储

C++ Linked List from header file is resetting memory storage

所以我一直在通过头文件在 C++ 中处理链表。当我向其中插入值时,它工作正常,但是一旦我 return 到主 class 并尝试打印存储在节点内的值,它 return 是一个负数。这是到目前为止我的代码的摘录,我尽量保持简单。

这是包含链表代码的头文件。

#pragma once
#include <iostream>
using namespace std;
template <typename T>
class LinkedList {

public:
struct Node {
    T data;
    struct Node* next;
};
Node* head;

void AddHead(const T& addData) {
    Node n;
    n.data = addData;
    n.next = head;
    head = &n;
    Print();
}

void Print() {
    cout << head << " " << (*head).data << endl;
}

private: 

};

这是来自 main 的引用。

LinkedList<int> l = LinkedList<int>();
int i = 5;
l.AddHead(i);
l.Print();

现在我认为这可以正常工作,但显然在添加节点、程序 return 从头文件中退出到再次打印之间发生了一些事情。我在里面放了第二个打印语句来显示差异。

目前的输出如下所示:

0000004F9A8FF7F8 5

0000004F9A8FF7F8 -1464607816

所以在同一个内存地址,里面存储的值发生了变化?我不知道自己做错了什么,感谢您的帮助。

void AddHead(const T& addData) {
    Node n;
    n.data = addData;
    n.next = head;
    head = &n;
    Print();
}

一旦 AddHead 结束 n 被释放,它就是堆栈上的一个临时变量。您必须在堆上创建节点

void AddHead(const T& addData) {
    Node *n = new Node();
    n->data = addData;
    n->next = head;
    head = n;
    Print();
}

下一个建议。不要使用裸指针,使用 std::shared_ptr 或 std::unique_ptr.