关于删除节点

时间:2014-03-12 15:36:22

标签: c++ memory-management nodes

我理解这些代码行正在做什么,当我想要delete一个Node时,它似乎正常工作。

temp = current->next;
current->next = current->next->next;
delete temp;

但是,有人可以向我解释如果你这样做会发生什么:

delete current->next;
current->next = current->next->next;            

我可能会"过度思考"但是当我delete current->next时,我是否删除了下一个指向的内容或指针next?因为当我执行第二位代码时,我显然会收到错误。 但是,为什么我无法改变next指向delete 指向的current->next 之后的{{1}}指向的内容?我只是想深入了解我在做什么。

2 个答案:

答案 0 :(得分:0)

一旦调用delete,就不需要内存包含任何有效内容。可能是删除的数据仍然与调用delete之前的数据相同,但这是未定义的行为,您不能依赖它。

因为你可以依赖有效的数据,任何阅读它的尝试都会给你带回垃圾或导致某种形式的访问冲突。

答案 1 :(得分:0)

使用指针引用在免费商店(也称为)中分配的内存区域,尽管这些术语指的是不同的地方。

假设您说的话

int* p = new int{42};

这里发生的事情是至少sizeof(int)字节的内存块被保留某处,并且您使用变量p来引用它。请注意,记忆区域并没有真正的名字;你只需用p来操纵它的内容。

现在很好,当你说

delete p;

您没有删除p,而是 p引用的内存区域。您可以(理论上)在上述语句之后使用p,但任何取消引用它的尝试都将导致未定义的行为。

在你的情况下,

delete current->next;

导致此指针引用的内存区域被释放,因此下一个语句

current->next = current->next->next;

不是一个好主意,因为current->next不再有效。