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

多指针指向同一数据:delete操作后内存泄漏与野指针问题问询

关于多指针指向同一内存与delete的问题解析

首先得揪出你代码里的核心错误:int a = 10;是在栈上分配的自动变量,完全不能用delete去释放! delete只能用来释放通过new关键字在堆上分配的内存,对栈变量调用delete属于未定义行为——程序可能直接崩溃、输出乱码,甚至看起来“正常运行”但埋下致命隐患,这种行为完全不可预测,绝对不能这么写。

假设你是笔误,实际想写的是堆分配的场景(比如int* a = new int(10);),那咱们来解答你的疑问:

  • 内存泄漏?不存在的。当你调用delete ptrA;时,已经把堆上那块存储10的内存归还给操作系统了,这块内存没有被遗忘,所以没有泄漏问题。
  • 悬空指针确实会出现。ptrA和ptrB这两个指针本身的数值(也就是内存地址)不会被delete修改,它们依然保存着原来那块内存的地址,但这块内存已经不属于你的程序了——这就是所谓的悬空指针。
  • 实际运行机制:delete的作用是告诉操作系统“这块内存我不用了,你可以收回去分给别的程序用”,它并不会清空指针里存储的地址值。所以这两个指针看起来还是“有效地址”,但指向的内存已经是非法区域了。如果后续你不小心用这两个指针去读/写内存,会触发未定义行为,轻则程序崩溃,重则破坏其他数据。

再回到你原本的代码,栈变量用delete的情况:栈内存是由编译器自动管理的,当变量超出作用域(比如函数返回)时,编译器会自动回收栈空间。你强行用delete去操作栈地址,相当于越权操作不属于堆管理的内存,几乎所有现代编译器和操作系统都会直接触发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:34