C++中delete命令异常疑问:删除指针后为何输出仍为5 5?(新手求助)
为什么delete指针后解引用还能读到旧值?
嘿,刚接触C++内存管理碰到这个问题太正常了!我来给你把这个现象说透:
首先先看你的代码:
#include <iostream> using namespace std; int main(){ int* i = new int(5); cout<< *i <<endl; delete i; cout<< *i <<endl; return 0; }
你看到的“delete之后还输出5”,本质是未定义行为带来的“巧合”,背后的原因是这样的:
delete到底做了什么?
delete的作用是告诉操作系统:“这块我用new申请的内存现在不用了,你可以回收回去,分给其他程序或者我后续的代码用”。但它不会立刻清空这块内存里的数据,也不会把指针i本身改成nullptr。指针i仍然保存着原来那块内存的地址,但这个地址对应的内存已经不属于你的程序了。为什么还能读到5?
操作系统回收内存后,不会马上覆盖里面的旧数据——毕竟覆盖也是要消耗资源的,只有当其他代码需要用到这块内存时,才会把新的数据写进去。你在delete之后立刻解引用,这块内存还没被重新分配,所以旧值5还留在那里,你就碰巧读到了。但这完全是运气!如果换个编译器、换个运行环境,或者在delete之后加几行其他代码(比如再new一个变量),你再解引用i,可能就会得到乱码、程序直接崩溃,或者其他奇怪的结果——C++标准里完全没规定这种情况该出现什么,这就是“未定义行为”的可怕之处:它的结果不可预测。新手该怎么避免踩坑?
- 用完delete之后,马上把指针置为
nullptr:delete i; i = nullptr;,这样后面如果不小心解引用这个指针,至少会触发明确的错误(比如程序崩溃),而不是偷偷读到旧值,让你误以为代码没问题。 - 记住:永远不要解引用已经被delete的指针,不管它看起来能输出什么,都是危险且不可靠的。
- 用完delete之后,马上把指针置为
内容的提问来源于stack exchange,提问作者LasuEr
相关产品推荐
相关产品推荐

