我正在尝试创建一个链表,我有一个 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)
一个主要问题是这两行:
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这种方式创建的所有节点,以避免内存泄漏。
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |