C++为什么创建一个新节点来删除堆栈上的节点是错误的
C++ why is creating a new node to delete a node on a stack wrong
我在课堂上学习单链表堆栈,我看到了这个stackoverflow页面,它给了我一些关于如何弹出节点的参考:
链表堆栈上的弹出功能
第一个答案使用以下代码弹出节点:
struct Node
{
int data;
Node *next;
};
int pop(Node *head)
{
while(head->next != NULL)
{
head = head->next;
}
int value;
Node *tmp;
tmp = new Node;
value = head->data;
tmp = head;
delete tmp;
return value;
}
第三个答案使用以下代码:
int pop( Node * &top )
{
int value = 0;
if ( top )
{
value = top->num;
Node *tmp = top;
top = top->next;
delete tmp;
}
return value;
}
现在,因为第一个答案,我最初这样写我的pop函数:
// Pop the top element off of the stack and return its value.
StackElement Stack::Pop()
{
assert (!Empty());
StackElement poppedData = tos->data;
Node *temp = new Node;
temp = tos;
tos = tos->next;
delete temp;
return poppedData;
}
但是,我的老师说,创建一个新节点来删除以前的节点会导致内存泄漏。
最终,我重写了我的代码,以匹配样式二:
StackElement Stack::Pop()
{
assert (!Empty());
StackElement poppedData = tos->data;
Node *temp = tos;
tos = tos->next;
delete temp;
return poppedData;
}
有人能向我解释为什么第一个实现是错误的吗?我很惊讶,当这个人把它发布在另一个stackoverflow问题上时,没有人对此发表评论。在我看来,我正在创建一个指向新节点(也称为新内存地址)的Node类型的指针temp,然后将该内存地址的值设置为堆栈内存地址顶部的值。我将栈顶移到下一个节点,然后删除我创建的这个临时节点,但因为我将其声明为一个新节点,它的值与旧栈顶的值相同,所以它实际上与该节点没有任何关系。旧的栈顶节点已从堆栈中删除,但内存未正确释放。这是正确的吗?
第一个答案是错误的。
tmp = new Node;
value = head->data;
tmp = head;
delete tmp;
这将删除您想要的head
指针。但是该函数在tmp
处创建新的内存分配,然后立即用值head
覆盖指针。您现在已经丢失了指向已分配数据的指针。这是内存泄漏。
相关文章:
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 为什么"delete"关键字不删除节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 删除 XML 文件中的子节点C++
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 从unordered_map中删除单个节点
- 删除链表中的特定节点
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 使用函数引用指向节点的指针删除链表中的节点?
- 双向链表 - 无法删除第一个节点
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- BST 节点删除 - 指针未正确删除
- 节点删除功能的链表问题
- 布尔函数始终为真,单向链表中的尾节点删除创建无限循环
- AVL树中节点删除值异常