【发布时间】:2026-01-14 06:20:03
【问题描述】:
我是新来的,正在学习动态内存和链表的主题。这是我遇到的问题。
void deletenode(Node*& head){
Node* temp = new Node;
temp = head; // I would like to create a new pointer to store the value of head node.
head=head->next; // and here I want to change the head node to the next one as I am going to delete it right after.
delete temp; // after I used the temp pointer to store the address of (the old) head, I would like to delete it.
}
但我仍然收到错误消息。
malloc: *** error for object: pointer being freed was not allocated
malloc: *** set a breakpoint in malloc_error_break to debug
在我之前的内存泄漏知识中,如果我们不删除new操作符分配的内存,就会导致内存泄漏,因为会有很多垃圾指针。但是为什么这个问题仍然发生在我的代码中,因为我似乎已经删除(或解除分配)temp 指针。刚学完这个话题,实在想不通到底出了什么问题,可能对这个话题还有很多误解。
更新:
感谢大家的帮助。问题已解决。我刚刚将Node* temp = new Node; 更改为Node* temp=head; 并且它有效。非常感谢您的所有建议!
【问题讨论】:
-
代码首先分配一个新节点并将其地址存储在
temp中。然后它将head的值分配给temp,丢弃新节点的地址。然后它会摆弄head指向的节点,然后删除head指向的节点。投诉似乎与最后一行有关。head是从哪里来的? (一般来说,只是删除一个节点的代码不需要分配另一个节点) -
很抱歉,我仍然有些困惑。让我举一个例子,以使其更清楚。例如,我们假设链表看起来像这样
1->2->3->4。并且总会有一个head节点指向链表的第一个节点。所以,我想实现函数deletenode(head)删除链表的第一个(或头)节点1。然后使headnode指向2。因此,如果我不分配一个新的保存原始头节点的指针(表示 1),如果不删除整个head(?),我可能无法删除1。 -
你不需要为
temp分配内存。执行Node* temp = head足以将temp设置为等于第一个元素。 -
总之,我不打算删除
head指针。我只想将指向 2 的head从 1 更改为不再需要 1。那么,这是否意味着我只需输入head=head->next。那么它将帮助我将头节点从 1 更改为 2 并且 1 将自动释放?无论如何,感谢您的帮助! -
1不会自动释放。只有在您执行delete temp时才会释放它。在调用函数之前,列表的内存已经分配。
标签: c++ pointers linked-list dynamic-memory-allocation