我理解这些代码行正在做什么,当我想要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}}指向的内容?我只是想深入了解我在做什么。
答案 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
不再有效。