How to fix this error :pointer being freed was not allocated

How to fix this error :pointer being freed was not allocated

我是新来的,正在学习动态内存和链表的主题。这是我遇到的问题。

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; 并且有效。非常感谢您的所有建议!

Node* temp = new Node;

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

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

temp = head;

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

 delete temp; 

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