从内存c ++中删除指针位置的项目?

时间:2013-05-17 22:44:55

标签: c++ pointers memory

我必须创建一个利用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

如果按照最上面的代码保存它,程序会正常运行并执行应该执行的操作,但我担心我没有正确清理内存占用。

3 个答案:

答案 0 :(得分:1)

第一个代码段就行了。当你这样做

delete item;

删除指针指向的内存,指针是临时的没有区别。你可以有许多指针指向内存中的相同位置,它们包含的只是该内存的地址。当你在其中一个上调用delete时,该内存被删除,你使用哪个指针并不重要,它们现在都指向已删除的内存,不应该被使用。

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

另外,正如haole所说,你应该确保使用new关键字创建指向的对象。始终将newdeletenew TYPE[]delete[]配对,如果由于某种原因使用代码中的C对应项malloc() / {{1}与calloc()

答案 1 :(得分:1)

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

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

所以当你删除那个指针时,这只是意味着你的程序告诉操作系统“嘿,我不再需要在0XCDEF这个空间,请为我清理它”

答案 2 :(得分:0)

如果使用“new”创建当前,则可能是安全的。

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