【问题标题】:How to fix this error :pointer being freed was not allocated如何修复此错误:未分配被释放的指针
【发布时间】: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


【解决方案1】:
Node* temp = new Node;

这会在动态范围内创建一个新对象,并将temp 设置为指向它。

此时,如果您愿意,您可以继续并delete 这个对象,最后一切都会好起来的。但是你这样做:

temp = head;

然后它立即替换了temp 指针,它现在指向另一个神秘的对象,它被传递到这个函数中,被这个head 指针引用。如果该对象在某些时候也是newed,它当然可以是deleted,但即使是这种情况,这也会导致内存泄漏,因为没有其他东西指向原始newed 对象,并且无法删除。

 delete temp; 

嗯,这现在指向head 所指向的任何东西。如果head 指向的东西是newed,那么这里可以是deleted,否则这是未定义的行为,会导致崩溃。在所有情况下,原始的new 都被泄露了。

【讨论】:

    最近更新 更多