0

0

C++ 悬挂指针(Dangling Pointer)是什么?(如何通过指针置空避免崩溃)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-12 18:04:04

|

770人浏览过

|

来源于php中文网

原创

悬挂指针是已指向被释放内存的指针,解引用会导致未定义行为;delete后立即置nullptr可使崩溃明确、易定位;智能指针通过raii机制从根本上避免该问题。

c++ 悬挂指针(dangling pointer)是什么?(如何通过指针置空避免崩溃)

悬挂指针是什么,为什么一用就崩

悬挂指针是已经指向被释放内存的指针,它本身还存着旧地址,但那块内存早已归还给系统或被复用。这时候再解引用(比如 *pp->field),行为未定义——可能读到垃圾值、触发段错误、偶然跑通但逻辑错乱,甚至在不同编译器/优化等级下表现不一致。

常见触发场景:delete p 后没清空 p,后续又误用;函数返回局部变量地址;容器重分配后原有迭代器/指针失效却继续使用。

delete 后立刻赋 nullptr 是最基础的防御手段

这不是“可选习惯”,而是 C++ 中对抗悬挂指针成本最低、效果最直接的实践。只要 delete(或 delete[])完,马上把指针设成 nullptr,后续解引用会直接崩溃(而不是静默错乱),且崩溃点明确,便于定位。

  • delete p;p = nullptr; 必须成对出现,不能只写前者
  • new[] 分配的数组,必须用 delete[] p; + p = nullptr;,混用 delete 会导致未定义行为
  • 多个指针可能指向同一块内存(比如别名),只清一个没用;需确保所有副本都置空,或改用智能指针统一管理

为什么不用智能指针就更容易踩坑

裸指针不带所有权语义,编译器不会帮你检查生命周期。你得自己记住谁 new、谁 delete、谁还在用——人在复杂调用链里很容易漏掉某处 delete,或重复 delete,或忘记置空。

PpcyAI
PpcyAI

泡泡次元AI-游戏美术AI创作平台,低门槛上手,高度可控,让你的创意秒速落地

下载

立即学习C++免费学习笔记(深入)”;

对比来看:std::unique_ptr 在析构时自动 delete 并置空内部指针;std::shared_ptr 用引用计数,对象真正销毁时才释放内存。它们从机制上杜绝了“释放后仍可解引用”的路径。

  • 局部作用域优先用 std::unique_ptr:构造即接管,离开作用域自动清理
  • 需要共享所有权时用 std::shared_ptr,但注意循环引用风险(可用 std::weak_ptr 打破)
  • 千万别把 new 出来的地址传给多个裸指针再各自 delete——这是典型的双重释放源头

调试时怎么快速发现悬挂指针

运行时崩溃不一定当场暴露问题根源。比如 p 在 A 函数被 delete 后没置空,B 函数再用它,崩溃发生在 B,但根因在 A。

  • 启用 AddressSanitizer(ASan):Clang/GCC 下加 -fsanitize=address,能捕获释放后使用、栈溢出等内存错误,并给出具体行号和调用栈
  • Debug 模式下可重载 operator new/delete,记录分配/释放地址,在解引用前检查该地址是否已释放(适合自研工具链)
  • 静态分析工具如 Clang Static Analyzer 或 PVS-Studio 能识别部分明显模式,比如 delete p; 后无条件使用 p

置空指针不能解决所有问题,但它把“不确定崩溃”变成“确定崩溃”,把“难定位”变成“好定位”。真正的难点从来不在怎么写 p = nullptr,而在于整个模块里有没有统一的资源归属约定、有没有人绕过 RAII 直接裸 new/delete、以及多人协作时是否默认信任了“他应该已经置空了”这种假设。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

410

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

587

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

218

2023.12.29

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

50

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

8

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.3万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号