从内存中移除指针位置的项
Removing item at pointer location from memory c++?
我必须创建一个利用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
关键字创建的。始终将new
与delete
配对,new TYPE[]
与delete[]
配对,如果您出于某种原因在代码中使用C对应,则malloc()
/calloc()
与free()
配对。
如果current是用"new"创建的,你可能是安全的。
如果您不确定,请使用Valgrind。这确实很方便,但你应该试着更好地学习你的语言的概念。
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- C++指针数组到字符数组中的特定位置
- 声明指针时更改星号的位置
- 如何在单个链表中交换两个节点的位置,只修改指针
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- 如何在内存位置取消指针,并用值启动它
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- 最简单的方法使多个指针一次指向同一位置,一次只处理2个位置
- 在指针中保存确定的位置
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- 将指针数组传递给数组,以便在 malloc() 发生的位置发挥作用
- 为什么在递增后使用 [] 运算符访问指针数组会返回错误地址的当前内存位置
- 试图读取AIFF文件意外错误与指针位置等有关
- 使用指针在字符串中获取字符的位置
- qtextstream弄乱了其位置指针
- 我如何知道一个位置指针在二维数组的行数
- 修正:访问冲突读取位置(指针到字符串数组)