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



我正在尝试创建一个链表,我有一个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;
}

cout只是让我看看发生了什么。每个head->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

一个主要问题是这两行:

Node<T> tempNode = Node<T>(item);
Node<T> *temp = &tempNode;

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

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

Node<T>* temp = new Node<T>(item);

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

相关内容

  • 没有找到相关文章

最新更新