我有一个用于删除链表中元素的小代码片段。这是代码:
if (head->data == num) {
delete head;
head = head->next;
}
你能向我解释一下为什么这段代码有效吗?它删除头部并将头部设置为下一个元素。
当我看到这个时,我认为这行不通,但它有效。
这是未定义的行为,所以任何事情都可能发生,包括看起来有效。
调用 delete 时,会将内存释放回操作系统。不能保证删除或清除任何内容。所以记忆可以保持与delete
之前相同,但这只是偶然的。访问它会导致未定义的行为。
对此的正确方法是:
if (head->data == num) {
aux = head;
head = head->next;
delete aux;
}
操作系统可能会推迟内存段的失效。您会看到删除微小的内存部分并不健壮,更重要的是您只能使用一个内存段,因此删除一次更有效。
从
已删除或释放的内存中访问数据并不是所有的建议。有时它可能有效,但行为未定义。