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