从内存中移除指针位置的项

Removing item at pointer location from memory c++?

本文关键字:位置 指针 内存      更新时间:2023-10-16

我必须创建一个利用STL的链表类型结构。其中有一个方法必须从这个链表结构中删除对象。我目前有方法重新链接表备份正确,但我不相信我实际上是从内存中正确删除对象。我目前做的是:

myItem* item = current; //Current position and item to be deleted.
/* Code to move all elements around */
current = current->next; //Move current position along one in the list.
delete item;

我担心的是,我所做的就是创建一个新的指针,然后在我移动了当前位置后删除指针,而不是删除项目本身。

我做了一点谷歌搜索,并试图添加命令删除[],但后来我得到分割错误,我编辑我的代码看起来像:

myItem* item = current; //Current position and item to be deleted.
/* Code to move all elements around */
current = current->next; //Move current position along one in the list.
delete[] item; //Deletes item at memory location
delete item; //Deletes temporary pointer

如果我按照上面的代码保持它,程序执行正确,做它应该做的,但我担心我没有正确清理我的内存占用

你做的是对的。指针只是一个内存地址,其值被复制到该局部变量中。

例如,current是一个myItem*指针,它可能指向地址0XCDEF。当您执行分配时,例如myItem* item = current,该内存地址被复制,因此现在item的值为0XCDEF。

所以当你删除指针时,这仅仅意味着你的程序告诉操作系统"嘿,我不再需要这个0XCDEF的空间了,请帮我清理一下"

第一个代码片段可以。当你做

delete item;

删除指针所指向的内存,指针是否是临时的没有区别。你可以有很多指针指向内存中的同一个位置,它们所包含的只是那个内存的地址。当你在其中一个指针上调用delete时,该内存将被删除,无论你使用哪个指针,它们现在都指向已删除的内存,不应该再使用。

关键字delete[]用于删除数组,它告诉c++查找从指针所指向的位置开始的数组的长度,并删除数组中的所有项。在这种情况下,您应该使用delete,当然,除非链接列表中的项是数组。

此外,正如haole所指出的,您应该确保所指向的对象是用new关键字创建的。始终将newdelete配对,new TYPE[]delete[]配对,如果您出于某种原因在代码中使用C对应,则malloc()/calloc()free()配对。

如果current是用"new"创建的,你可能是安全的。

如果您不确定,请使用Valgrind。这确实很方便,但你应该试着更好地学习你的语言的概念。