0

我不得不创建一个利用 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

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

4

3 回答 3

1

第一个代码片段是好的。当你这样做

delete item;

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

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

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

于 2013-05-17T22:48:59.963 回答
1

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

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

因此,当您删除该指针时,这仅意味着您的程序正在告诉操作系统“嘿,我不再需要 0XCDEF 处的这个空间,请为我清理它”

于 2013-05-17T22:49:12.527 回答
0

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

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

于 2013-05-17T22:52:56.040 回答