为什么我在C++中删除动态分配的指针时会出现错误?
delete触发报错的核心原因
- 代码存在内存所有权严重错配问题,属于C++标准定义的未定义行为,运行时必然触发崩溃报错
- 执行
p = new int;后,p指向了堆区申请的动态内存块,这是唯一允许被delete合法回收的内存来源 - 后续执行
p = &a;时,p的指针值被直接覆盖为栈上局部变量a的地址,此时原p指向的堆内存彻底丢失访问路径(直接造成内存泄漏),p的指向已经从堆内存切换为栈内存 - 最后执行
delete p时,本质是尝试对栈内存地址执行堆内存回收操作,内存管理器校验到非法内存操作后直接终止程序抛出报错
对应修复逻辑
- 严格遵守C++内存操作规则:只有通过
new直接申请的堆内存指针,才能对应使用delete回收,栈变量、全局变量的地址绝对不能传入delete接口 - 如果确实需要让p指向局部变量a,必须先回收p当前持有的堆内存,完成后绝对不能再对p执行delete操作,参考合法流程:
p = new int; delete p; // 先释放原堆内存,避免内存泄漏 p = &a; // 后续p仅指向栈变量,禁止再对p调用delete
内容的提问来源于stack exchange,提问作者ekremturkoglu
相关产品推荐
相关产品推荐

