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
指针引用。如果那个对象在某个时候也被 new
ed,它当然可以是 delete
d,但即使是这种情况也会导致内存泄漏,因为没有其他指向原始 new
ed对象,无法删除。
delete temp;
嗯,现在指向 head
指向的任何内容。如果 head
指向被 new
ed 的东西,它可以在这里 delete
d ,否则这是未定义的行为,并且会崩溃。在所有情况下,原始 new
都被泄露了。
我是新来的,正在学习动态内存和链表的主题。这是我遇到的问题。
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
指针引用。如果那个对象在某个时候也被 new
ed,它当然可以是 delete
d,但即使是这种情况也会导致内存泄漏,因为没有其他指向原始 new
ed对象,无法删除。
delete temp;
嗯,现在指向 head
指向的任何内容。如果 head
指向被 new
ed 的东西,它可以在这里 delete
d ,否则这是未定义的行为,并且会崩溃。在所有情况下,原始 new
都被泄露了。