头指针不会留在前面(C++)

0 c++ linked-list

我正在尝试创建一个链表,我有一个 Node 类和一个 List 类。列表构造函数将 Head 和 Tail(Node* 类型)设置为 nullptr。这两个类都是模板化的。我的列表插入方法不会将头指针指向开头,我真的不知道为什么。它仅在 head == nullptr 时分配一次。

这里是插入方法。

void insert(T item)
    {
      //insert item at end
      //allocate new node
      Node<T> tempNode = Node<T>(item);
      Node<T> *temp = &tempNode;
      //put in data
      temp->setData(item);
      //end of list set to null
      temp->setNext(nullptr); 

      //if first node
      if (head == nullptr)
      {
        //head and tail are set to temp
        head = temp;
        cout << "head1: " << head->getData() << endl;
        tail = temp;
      } else //not first node in list
      { cout << "head: " << head->getData() << endl;
        tail->setNext(temp);
        tail = temp;
      }

      cout << "tail: " << tail->getData() << endl;
      cout << "head: " << head->getData() << endl;
      cout << "head: " << head << endl;
    }
Run Code Online (Sandbox Code Playgroud)

cout 只是让我看看发生了什么。Everyhead->getData()产生当前保存在 temp 中的值,但是当我打印头时,它每次都是相同的地址。

为了清楚起见,我有一个单独的测试文件,它循环 0-9 尝试插入每个值。这样做的结果是……

head1: 0
tail: 0
head: 0
head: 0x7fffc574dc40
head: 1
tail: 1
head: 1
head: 0x7fffc574dc40
head: 2
tail: 2
head: 2
head: 0x7fffc574dc40
head: 3
tail: 3
head: 3
head: 0x7fffc574dc40
head: 4
tail: 4
head: 4
head: 0x7fffc574dc40
head: 5
tail: 5
head: 5
head: 0x7fffc574dc40
head: 6
tail: 6
head: 6
head: 0x7fffc574dc40
head: 7
tail: 7
head: 7
head: 0x7fffc574dc40
head: 8
tail: 8
head: 8
head: 0x7fffc574dc40
head: 9
tail: 9
head: 9
head: 0x7fffc574dc40
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 6

一个主要问题是这两行:

Node<T> tempNode = Node<T>(item);
Node<T> *temp = &tempNode;
Run Code Online (Sandbox Code Playgroud)

在这里,您temp指向局部变量tempNode。当函数insert返回tempNode结束的生命周期并被破坏时。指针temp(以及该指针的所有副本)将无效。之后尝试使用此指针将导致未定义的行为

创建新节点的常用解决方案是动态分配它们:

Node<T>* temp = new Node<T>(item);
Run Code Online (Sandbox Code Playgroud)

您当然必须记住以delete这种方式创建的所有节点,以避免内存泄漏