我有一个用于删除链接列表中的元素的小代码片段。 下面是代码:使用无逻辑删除
if (head->data == num) {
delete head;
head = head->next;
}
能否请您给我解释一下,为什么这个代码工作。它删除头部并将头部设置为下一个元素。
当我看到这个,我认为这不会工作,但它的工作。
我有一个用于删除链接列表中的元素的小代码片段。 下面是代码:使用无逻辑删除
if (head->data == num) {
delete head;
head = head->next;
}
能否请您给我解释一下,为什么这个代码工作。它删除头部并将头部设置为下一个元素。
当我看到这个,我认为这不会工作,但它的工作。
这是未定义的行为,所以任何事情都可能发生,包括出现工作。
当您调用delete时,您将释放内存回操作系统。无法保证所有内容都被删除或清除。所以内存可以保持与delete
之前相同,但这只是偶然。访问它会导致未定义的行为。
这样做的一个正确的做法是:
if (head->data == num) {
aux = head;
head = head->next;
delete aux;
}
你能解释为什么这可以确保内存被释放吗?另外,C的规则是否相同?即'aux = head; head = head-> next;免费(aux)'确保内存被释放? – rajatkhanduja
@rajatkhanduja内存在两种情况下都被释放。我的代码不会遇到未定义的行为,因为您不再访问无效指针。 - 在你调用'delete'之后你不能访问指针。 –
哦!所以它更像是一种很好的编码习惯。谢谢 ! – rajatkhanduja
OS可能会推迟内存段无效。您会发现删除小内存部件并不健全,您只能使用一个内存段,因此删除一次更为有效。
从已经被删除或释放的内存中访问数据并非都是可取的。有些时候它可能工作,但行为是未定义的。
虽然它不是一个确切的重复,但概念是相同的...阅读这个传奇的答案由Eric Lippert http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-访问范围之外/ 6445794#6445794 – Aamir
我想我们现在需要一个标签“为什么做这个工作” –