You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的指针,不管它看起来能输出什么,都是危险且不可靠的。

内容的提问来源于stack exchange,提问作者LasuEr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:47:43