在链表中删除该节点时,Node* 接下来会发生什么情况
What happens to Node* next when deleting that Node in a linked list?
在使用
struct Node {
T value;
Node* next;
}
对于每个使用的新运算符(new Node())
,必须有一个删除运算符。此类列表的析构函数示例
~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
。
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- 在不知道套接字的情况下关闭网络连接
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 发生注入类名时会发生什么情况?(C++)
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 重新分配向量时,向量中的内存会发生什么情况
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 当在C++中找到所需的行时,如何从文件中获取接下来的 n 行
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 使用 Google 基准测试时返回值会发生什么情况?
- 正在连接的等待条件变量的线程会发生什么情况?
- 在链表中删除该节点时,Node* 接下来会发生什么情况
- 当库静态链接时,静态变量会发生什么情况
- 动态链接共享库中的全局变量和静态变量会发生什么情况
- glBindAttribLocation接下来是什么
- Heisenbug问题与使用dll.接下来我要做什么?