c++ - 在链表中删除该节点时,Node* 接下来会发生什么?
问题描述
在使用的链表中
struct Node {
T value;
Node* next;
}
对于每个使用的 new运算符(new Node())
,都必须有一个delete运算符。此类列表的析构函数示例
~LinkedList(){
Node* tmp = head;
while(tmp! = nullptr){
delete tmp;
tmp = tmp->next;
}
}
我的问题是,究竟是什么被“删除”了,即使在使用delete之后,我也可以使用next指针?它只删除值吗?它在记忆中的实际表现如何?
解决方案
在 C++ 中,当您删除堆上的对象时,实际上并没有清理任何东西,它只是将内存标记为“空闲”。这意味着另一个调用new
或malloc
可能覆盖该内存。
访问已删除的指针是未定义的行为,因为它们不能保证驻留在那里的数据。我不太精通操作系统如何处理内存,但我相信如果这是您从该部分内存中删除的最后一项,您的程序甚至可能不再拥有该页面。如果发生这种情况,那么取消引用该指针将在大多数桌面操作系统上导致分段错误。
如果您想安全地移动头部,您应该在指针处于活动状态时为下一项分配一个临时值,然后您可以从内存中删除底层对象。
推荐阅读
- django - Django ManyToMany关系,modelmultiplechoicefield的过滤选项
- go - 似乎无法开始使用 Go 和 Echo
- php - 具有变体标准的徽章系统,数据库设计
- java - 我应该如何使用异步通信实现 GET 端点?
- javascript - JS菜单功能转到同一页面但即使清除了DOM元素也调用了两个功能
- python - 验证损失和训练损失曲线,可以接受吗?
- python - Button 中的 Kivy Button
- r - 如何为 plot_usmap 指定 bin 颜色?
- c# - 有没有办法设置变量的地址?
- python - Tensorflow Keras - 训练时精度高,预测时精度低