我必须创建一个利用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;
我担心的是,我正在做的就是创建一个新指针,然后在我移动当前位置后删除指针,而不是删除项目本身。
我做了一些谷歌搜索,并尝试添加命令delete [],但后来我得到分段错误,我编辑我的代码看起来像:
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
如果按照最上面的代码保存它,程序会正常运行并执行应该执行的操作,但我担心我没有正确清理内存占用。
答案 0 :(得分:1)
第一个代码段就行了。当你这样做
delete item;
删除指针指向的内存,指针是临时的没有区别。你可以有许多指针指向内存中的相同位置,它们包含的只是该内存的地址。当你在其中一个上调用delete
时,该内存被删除,你使用哪个指针并不重要,它们现在都指向已删除的内存,不应该被使用。
关键字delete[]
用于删除数组,它告诉C ++查找从指针指向的数据开始的数组长度并删除数组中的所有项。在这种情况下,您应该使用delete
,除非链接列表中的项目是数组。
另外,正如haole所说,你应该确保使用new
关键字创建指向的对象。始终将new
与delete
,new TYPE[]
与delete[]
配对,如果由于某种原因使用代码中的C对应项malloc()
/ {{1}与calloc()
。
答案 1 :(得分:1)
你所做的是正确的。指针只是一个内存地址,值将被复制到该局部变量中。
例如current
是一个myItem*
指针,它可能指向地址0XCDEF。
当您执行myItem* item = current
之类的分配时,会复制该内存地址,因此现在item
的值为0XCDEF。
所以当你删除那个指针时,这只是意味着你的程序告诉操作系统“嘿,我不再需要在0XCDEF这个空间,请为我清理它”
答案 2 :(得分:0)
如果使用“new”创建当前,则可能是安全的。
如果您不确定,请使用Valgrind。这真的很方便,但你应该尝试更好地学习你的语言概念。