我有一个用于删除链表中元素的小代码片段。这是代码:
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;
}
操作系统可以推迟内存段的失效。你看到删除微小的内存部分并不可靠,而且你可以只使用一个内存段,所以删除一次更有效。
从已删除或释放的内存中访问数据并非都是可取的。有时它可能会起作用,但行为是未定义的。