讲师中心 微信公众号
AI工具推荐 视频效率加速

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

星宇吖_8120

星宇吖_8120

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

|

830人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

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

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“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工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

堆和栈的区别
堆和栈的区别

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

6567

2023.07.18

堆和栈区别
堆和栈区别

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

2728

2023.08.10

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

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

179

2025.11.16

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

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

3371

2023.11.13

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

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

1025

2023.12.29

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

0

2026.11.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn