Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++_Memory Management_Nodes - Fatal编程技术网

C++ 关于删除节点

C++ 关于删除节点,c++,memory-management,nodes,C++,Memory Management,Nodes,我了解这些代码行在做什么,当我想删除节点时,它似乎工作正常 temp = current->next; current->next = current->next->next; delete temp; 但是,有人能向我解释一下,如果你这样做,会发生什么情况: delete current->next; current->next = current->next->next; 我可能“想得太多了”,但当我delete c

我了解这些代码行在做什么,当我想
删除
节点时,它似乎工作正常

temp = current->next;
current->next = current->next->next;
delete temp;
但是,有人能向我解释一下,如果你这样做,会发生什么情况:

delete current->next;
current->next = current->next->next;            
我可能“想得太多了”,但当我
delete current->next
时,我是在删除next指向的内容还是指针
next
?因为当我执行第二位代码时,我显然会出错。
但是,为什么在我
delete
当前的
next
指向的任何东西之后,我不能更改
next
指向的内容?我只是想对我正在做的事情有一个确切的了解。

一旦你调用了
delete
,内存就不需要包含任何有效的内容。可能是删除的数据仍然与调用
delete
之前相同,但这是未定义的行为,您不能依赖它


因为您可以依赖于数据的有效性,所以任何读取数据的尝试都将返回垃圾或导致某种形式的访问冲突。

您使用指针引用在空闲存储区分配的内存区域(也称为堆,尽管这些术语指的是不同的位置)

假设你说的是

int* p = new int{42};
这里发生的事情是,至少有
sizeof(int)
字节的内存块被保留在某个地方,您可以使用变量
p
来引用它。请注意,内存区域实际上没有名称;您只需使用
p
来操作其内容

好吧,当你说

delete p;
您不是在删除
p
,而是在删除
p
所指的内存区域。理论上,您可以在上述语句之后使用
p
,但任何试图取消引用该语句的行为都将导致未定义的行为

就你而言

delete current->next;
导致解除分配此指针引用的内存区域,并因此释放下一条语句

current->next = current->next->next;

这不是一个好主意,因为
current->next
不再有效。

错误并不是您试图给它一个新值。这是您尝试赋予的新值,它涉及到您通过刚刚删除的节点!哦,当然!如果是这样的话,那么我想现在就完全有道理了!:)非常感谢。