使用无逻辑删除



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

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

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

当我看到这个时,我认为这行不通,但它有效。

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

调用 delete 时,会将内存释放回操作系统。不能保证删除或清除任何内容。所以记忆可以保持与delete之前相同,但这只是偶然的。访问它会导致未定义的行为。

对此的正确方法是:

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

操作系统可能会推迟内存段的失效。您会看到删除微小的内存部分并不健壮,更重要的是您只能使用一个内存段,因此删除一次更有效。

已删除或释放的内存中访问数据并不是所有的建议。有时它可能有效,但行为未定义。

相关内容

  • 没有找到相关文章

最新更新