Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除链接列表中的节点时,节点*接下来会发生什么情况?_C++_Pointers_Memory Management - Fatal编程技术网

C++ 删除链接列表中的节点时,节点*接下来会发生什么情况?

C++ 删除链接列表中的节点时,节点*接下来会发生什么情况?,c++,pointers,memory-management,C++,Pointers,Memory Management,在使用 struct Node { T value; Node* next; } 对于每个使用的新操作符(new Node()),必须有一个delete操作符。 此类列表的析构函数示例 ~LinkedList(){ Node* tmp = head; while(tmp! = nullptr){ delete tmp; tmp = tmp->next; } } 我的问题是,到底是什么被“删除”了,允许我使用下一个指针 甚至在使用删除之

在使用

struct Node {
  T value;
  Node* next; 
}
对于每个使用的新操作符
(new Node())
,必须有一个delete操作符。 此类列表的析构函数示例

~LinkedList(){ 
   Node* tmp = head;
   while(tmp! = nullptr){
     delete tmp;
     tmp = tmp->next;
   }
 }
我的问题是,到底是什么被“删除”了,允许我使用下一个指针
甚至在使用删除之后?它是否只删除该值?在内存中实际上是如何看的?C++中的

< P>当你在堆上删除一个对象时,实际上没有任何东西被清理干净,它只是标记内存为“空闲”。这意味着对
new
malloc
的另一个调用可能会覆盖该内存

访问已删除指针是未定义的行为,因为它们不能保证驻留在那里的数据。我不太熟悉操作系统如何处理内存,但我相信,如果这是您从该部分内存中删除的最后一项,您的程序甚至可能不再拥有该页面。如果发生这种情况,那么取消对该指针的引用将导致大多数桌面操作系统出现分段错误


如果要安全地移动头部,应在指针处于活动状态时为下一项指定一个临时值,然后可以从内存中删除基础对象。

删除数据时,指针将变得未定义,并且肯定不会到达它之前指向的内存,因此,删除后无法调用
tmp=tmp->next'

正确的析构函数声明应该是:

~LinkedList()
{
    while (head != nullptr)
    {
        Node * tmp = head->next;
        delete head;
        head = tmp;
    }
}
顺便说一句:请阅读一些关于如何实现列表的好书


顺便说一句:如果您确实需要,请使用一些标准容器,如
vector
list

delete伴随着移动。链接列表中上一项的下一个元素现在指向已删除项之后的元素。代码中有错误。如果您调用
delete tmp
,则在tmp->next中,您将遇到访问冲突或类似的情况
delete tmp
后的
delete tmp
有时可能会起作用,但这是严格未定义的行为。@MichaelChourdakis不在该代码中。@MichaelChourdakis
delete
不伴有移动,您的其余注释均不在此代码中出现。你在说什么?C++在删除指针之前不做内存边界检查或验证。如果它们以前在那里是有效内存,只要应用程序仍然拥有该内存页,就可以取消对它的引用。当该位置的数据不再表示有效对象(已被覆盖)时,由于任何内部指针现在都是完全不同的数据,在原始对象之外的内存上发生的读/写操作很可能会导致错误。指针不会“变得未定义”;当然,它指向的是它之前指向的同一个内存。问题是这个内存现在被释放了,因此它可能随时被覆盖,甚至映射到用户的地址空间之外。OP的代码可能大部分时间都能正常工作。