多指针指向同一数据: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
相关产品推荐
相关产品推荐

