【C++】020、野指针&悬空指针

一、野指针与悬空指针

  • 野指针和悬空指针都指向非法内存

  • 野指针是指从未有效的指针(出生时就没被赋值),而悬空指针是曾经有效,但已失效的指针。(对象死了,但指针还在)

  • 两者一旦解引用,会触发未定义行为,绝大多数情况下会直接导致崩溃崩溃

二、对比

|----------|------------------------|-----------------------------------|
| 维度 | 野指针 | 悬空指针 |
| 定义 | 未初始化或已被赋值的指针,指向垃圾地址 | 指针曾指向内存,但该内存已被释放或销毁 |
| 根源 | 忘了初始化(是栈上的脏数据) | 忘了通知释放内存,却没把指针置空 |
| 典型场景 | int *p;(指针p未赋初值,直接使用) | delete p; 没置nullptr,或函数返回了局部变量的地址 |
| 崩溃时机 | 随机崩溃 | 使用崩溃 |

三、常见异常场景

  • 悬空指针不只有delete。(返回局部变量地址也是悬空指针)

  • 置空并不能解决所有悬空问题,当有多个指针指向该对象时,还存在其他指针变量出现悬空地址。

  • 野指针不等于nullptr,在栈上声明的指针变量,其值是该栈帧内存中残留的随机脏数据。所以使用if(p!=nullptr)方式防不住野指针。

四、实战避坑

  • 强制初始化:声明指针时必须初始化,要么指向有效对象,要么赋值为nullptr

  • 释放即置空:delete或free后,立即将指针赋值为nullptr

  • 缩小作用域:尽量将指针声明在最小的作用域内

  • 开启编译器扫描警告

  • 终极解决方案:RAII原则+智能指针,尽量避免使用裸指针。

相关推荐
鶴哥只手遮天36 分钟前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天38 分钟前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天44 分钟前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天44 分钟前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 13 章 MCP 客户端:传输、工具聚合与命名冲突
java·人工智能·开源