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