当前位置: 首页 > news >正文

c++ 空指针,悬挂指针(悬空指针),野指针

在 C、C++ 等编程语言中,指针是一个强大但容易出错的特性。除了空指针、悬挂指针、野指针外,还有一些其他类型的指针概念。下面为你详细介绍它们的区别和示例:

1. 空指针(Null Pointer)

定义:明确不指向任何内存地址的指针,通常用NULL(C)或nullptr(C++)表示。
产生场景

  • 显式赋值为NULL/nullptr
  • 函数失败时返回NULL(如malloc(0)可能返回NULL)。

风险:解引用空指针会导致程序崩溃(段错误)。

示例

int* ptr = NULL;
// *ptr = 10;  // 错误:解引用空指针

2. 悬挂指针(Dangling Pointer)

定义:指向已释放内存的指针。
产生场景

  • 对象被delete/free后,指针未被置空。
  • 返回局部变量的地址(函数结束后局部变量已销毁)。

风险:解引用悬挂指针会导致未定义行为(如读取随机数据、程序崩溃)。

示例

int* ptr = new int(42);
delete ptr;  // 内存已释放
// ptr 现在是悬挂指针
// *ptr = 10;  // 危险:解引用悬挂指针
int* getLocalPtr() {int x = 10;return &x;  // 错误:返回局部变量的地址(悬挂指针)
}
// int* ptr = getLocalPtr();  // ptr 是悬挂指针

3. 野指针(Wild Pointer)

定义:未初始化的指针,指向随机内存地址。
产生场景

  • 指针声明后未赋值就使用。

风险:解引用野指针会访问非法内存,导致程序崩溃或数据损坏。

示例

int* ptr;  // 野指针(未初始化)
// *ptr = 10;  // 错误:解引用野指针

4. 无效指针(Invalid Pointer)

定义:泛指所有指向无效内存的指针,包括悬挂指针、野指针,以及越界指针。
产生场景

  • 使用已释放的内存(悬挂指针)。
  • 访问数组越界位置。

风险:解引用无效指针导致未定义行为。

示例

int arr[5];
int* ptr = &arr[10];  // 越界指针(无效)
// *ptr = 10;  // 错误:访问非法内存

5. 野引用(Wild Reference)

定义:C++ 中未初始化的引用(语法层面不允许,但可通过强制类型转换间接产生)。
产生场景

  • 通过非法内存地址创建引用。

风险:使用野引用会导致未定义行为。

示例

int& ref = *(int*)0x12345678;  // 野引用(指向随机地址)
// ref = 10;  // 危险:修改非法内存

6. 悬空引用(Dangling Reference)

定义:与悬挂指针类似,但针对引用类型。
产生场景

  • 引用的对象被销毁后,引用仍然存在。

风险:使用悬空引用会导致未定义行为。

示例

int& getLocalRef() {int x = 10;return x;  // 错误:返回局部变量的引用(悬空引用)
}
// int& ref = getLocalRef();  // ref 是悬空引用

7. 空悬指针(Dangling Pointer)

说明:与 “悬挂指针” 是同一概念的不同翻译。

8. 野指针(Uninitialized Pointer)

说明:与 “野指针” 是同一概念,强调未初始化的特性。

9. 函数指针错误

定义:错误地调用函数指针。
产生场景

  • 函数指针未初始化或指向无效函数。

风险:调用无效函数指针会导致程序崩溃。

示例

void (*funcPtr)() = NULL;
// funcPtr();  // 错误:调用空函数指针

10. 野指针(Wild Pointer)与野引用(Wild Reference)的对比

指针类型定义示例风险
野指针未初始化的指针int* ptr;解引用非法内存
野引用通过非法地址创建的引用int& ref = *(int*)0x1234;修改非法内存

如何避免这些问题?

  1. 空指针:使用前检查是否为NULL/nullptr
  2. 悬挂指针:释放内存后立即将指针置空,避免返回局部变量地址。
  3. 野指针:声明时初始化指针,或赋值为nullptr
  4. 使用智能指针(C++):
    std::unique_ptr<int> ptr = std::make_unique<int>(42);  // 自动管理内存
    

总结对比表

指针类型定义典型场景解引用风险
空指针指向NULLint* ptr = nullptr;立即崩溃(段错误)
悬挂指针指向已释放的内存delete ptr;后未置空未定义行为(可能随机值)
野指针未初始化的随机指针int* ptr;(未赋值)崩溃或数据损坏
无效指针泛指所有无效内存的指针越界指针、重复释放的指针未定义行为
悬空引用引用已销毁的对象返回局部变量的引用未定义行为

通过理解这些概念和示例,可以有效减少指针相关的 bug,提高代码的健壮性。

http://www.lqws.cn/news/511651.html

相关文章:

  • 总结汇报思路
  • 重点解析(软件工程)
  • 使用markRaw实例化echarts对象
  • RAG实战 第三章:知识库构建与管理
  • OSS安全合规实战:金融行业敏感数据加密+KMS自动轮转策略(满足等保2.0三级要求)
  • 宝塔服务器调优工具 1.1(Opcache优化)
  • 跟着chrome面板优化页面性能
  • 中断控制与实现
  • 《C++》命名空间简述
  • AutoGPT,自主完成复杂任务
  • 安卓9.0系统修改定制化____安卓9.0修改 默认开启开发者选项与usb调试的操作步骤解析 十一
  • 2025.6.24总结
  • # Python中等于号的使用
  • 创建首个 Spring Boot 登录项目
  • Linux零基础快速入门到精通
  • 大模型本地部署,拥有属于自己的ChatGpt
  • Vue 英雄列表搜索与排序功能实现
  • Verilog基础:编译指令`default_nettype
  • Harmony状态管理@Event
  • ubuntu16编译paho.mqtt.c 及 paho.mqtt.cpp编译问题
  • 屠龙刀策略
  • Web攻防-CSRF跨站请求伪造Referer同源Token校验复用删除置空联动上传或XSS
  • 统计学纯基础(1)
  • C++ 快速回顾(一)
  • 学习记录:DAY33
  • linux操作系统的软件架构分析
  • Redis 分布式锁原理与实战-学习篇
  • 我的字节一面
  • DeepSeek智能总结 | 邓紫棋音乐版权纠纷核心梳理
  • Dify,FastGPT,RagFlow有啥区别,在智能问答方面有啥区别