0

我有一个用于删除链表中元素的小代码片段。这是代码:

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

您能否向我解释一下,为什么这段代码有效。它删除头部并将头部设置为下一个元素。

当我看到这个时,我认为这不起作用,但它有效。

4

3 回答 3

7

这是未定义的行为,所以任何事情都可能发生,包括看起来有效。

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

一个适当的方法是:

if (head->data ==  num) {
    aux = head;
    head = head->next;
    delete aux;
}
于 2012-06-21T11:07:42.353 回答
2

操作系统可以推迟内存段的失效。你看到删除微小的内存部分并不可靠,而且你可以只使用一个内存段,所以删除一次更有效。

于 2012-06-21T11:12:03.060 回答
0

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

于 2012-06-24T07:10:36.353 回答