C++循环链表析构时指针已设为null却判断为真是什么原因?
核心原因
你对指针的赋值逻辑和指向关系存在误解:
- 指针本质是存储内存地址的独立变量,
Node* p = end->next;的操作只是将end->next中存储的「start节点的内存地址」复制给p,此时p和end->next是两个完全独立的指针变量,只是暂时指向同一块内存。 - 你执行
end->next = NULL;的操作,仅修改了end结构体内部next指针本身存储的地址值,把它改成了空地址,这个操作既不会修改p存储的地址值,也不会修改start节点本身的内容,p仍然指向原来的start节点,因此p != NULL判断结果为真。 - 你以为「把end->next设为NULL就会让start指向空」是完全错误的:
end->next只是一个指向start的指针,修改它的指向仅代表end不再指向start,不会对start节点或者其他指向start的指针产生任何影响。
析构逻辑验证
这段析构代码的设计是合理的,运行逻辑完全正常:
- 你通过
end->next = NULL把原本的循环链表从尾部打断,变成了普通的单链表,避免了遍历死循环 - while循环从首节点开始逐个遍历删除所有节点,不会出现内存泄漏,也不会出现越界访问问题
内容的提问来源于stack exchange,提问作者James Newman
相关产品推荐
相关产品推荐

