在链表中使用
struct Node {
T value;
Node* next;
}
对于每个使用的 new 运算符 (new Node())
,必须有一个 delete 运算符。
此类列表的析构函数示例
~LinkedList(){
Node* tmp = head;
while(tmp! = nullptr){
delete tmp;
tmp = tmp->next;
}
}
我的问题是,究竟是什么被“删除”,允许我使用 next 指针 即使在使用了delete 之后?它只删除值吗?这实际上在内存中看起来如何?
最佳答案
在 C++ 中,当您删除堆上的一个对象时,实际上并没有清除任何东西,它只是将内存标记为“空闲”。这意味着对 new
或 malloc
的另一个调用可能会覆盖该内存。
访问已删除的指针是未定义的行为,因为它们不能保证驻留在那里的数据。我不太精通操作系统如何处理内存,但我相信如果那是你从那部分内存中删除的最后一项,你的程序甚至可能不再拥有该页面。如果发生这种情况,那么取消对该指针的引用将导致大多数桌面操作系统出现段错误。
如果您想安全地移动头部,您应该在指针处于事件状态时为下一项分配一个临时值,然后您可以从内存中删除底层对象。
关于c++ - 在链表中删除该节点时,节点*接下来会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590537/