2012-06-21 51 views
0

我有一个用于删除链接列表中的元素的小代码片段。 下面是代码:使用无逻辑删除

if (head->data == num) { 
    delete head; 
    head = head->next; 
} 

能否请您给我解释一下,为什么这个代码工作。它删除头部并将头部设置为下一个元素。

当我看到这个,我认为这不会工作,但它的工作。

+4

虽然它不是一个确切的重复,但概念是相同的...阅读这个传奇的答案由Eric Lippert http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-访问范围之外/ 6445794#6445794 – Aamir

+1

我想我们现在需要一个标签“为什么做这个工作” –

回答

7

这是未定义的行为,所以任何事情都可能发生,包括出现工作。

当您调用delete时,您将释放内存回操作系统。无法保证所有内容都被删除或清除。所以内存可以保持与delete之前相同,但这只是偶然。访问它会导致未定义的行为。

这样做的一个正确的做法是:

if (head->data == num) { 
    aux = head; 
    head = head->next; 
    delete aux; 
} 
+1

你能解释为什么这可以确保内存被释放吗?另外,C的规则是否相同?即'aux = head; head = head-> next;免费(aux)'确保内存被释放? – rajatkhanduja

+1

@rajatkhanduja内存在两种情况下都被释放。我的代码不会遇到未定义的行为,因为您不再访问无效指针。 - 在你调用'delete'之后你不能访问指针。 –

+0

哦!所以它更像是一种很好的编码习惯。谢谢 ! – rajatkhanduja

2

OS可能会推迟内存段无效。您会发现删除小内存部件并不健全,您只能使用一个内存段,因此删除一次更为有效。

0

从已经被删除或释放的内存中访问数据并非都是可取的。有些时候它可能工作,但行为是未定义的。