在使用
的链接列表中struct Node {
T value;
Node* next;
}
对于每个使用的 new 运算符(new Node())
,必须有一个 delete 运算符。
此类列表的析构函数示例
~LinkedList(){
Node* tmp = head;
while(tmp! = nullptr){
delete tmp;
tmp = tmp->next;
}
}
我的问题是,究竟什么被“删除”了,从而允许我使用 next 指针 即使在使用删除之后?它只会删除值吗?实际在内存中看起来如何?
答案 0 :(得分:1)
在C ++中,当删除堆上的对象时,实际上没有任何清理内容,它只是将内存标记为“空闲”。这意味着再次调用new
或malloc
可能会覆盖该内存。
访问已删除的指针是未定义的行为,因为它们不能保证驻留在那里的数据。我对操作系统如何处理内存不是很精通,但我相信,如果这是您从该内存部分中删除的最后一项,则您的程序可能不再拥有该页面。如果确实是这种情况,那么取消引用该指针将导致大多数台式机操作系统出现分段错误。
如果要安全移动头部,应在指针处于活动状态时为下一项分配一个临时值,然后可以从内存中删除基础对象。
答案 1 :(得分:0)
删除数据后,指针将变为未定义状态,并且确保不会到达其之前指向的内存,因此删除后将无法调用tmp=tmp->next'
。
正确的析构函数声明为:
~LinkedList()
{
while (head != nullptr)
{
Node * tmp = head->next;
delete head;
head = tmp;
}
}
顺便说一句。:请阅读一些有关如何实现列表的好书。
BTW.2:如果确实需要,请使用一些标准容器,例如vector
或list
。