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

野指针和内存泄漏是什么?

野指针和内存泄漏是 C/C++ 中两个非常常见且危险的内存管理问题,下面我们详细讲解:


🧨 1. 什么是野指针(Dangling Pointer)?

野指针是指向无效(已经释放或未初始化)内存区域的指针

✅ 典型情况:

🧱 情况一:指针未初始化
int* p;      // 未初始化,p 指向未知地址
*p = 10;     // 💥 未定义行为,野指针!
🧱 情况二:指针指向的内存已被释放
int* p = new int(10);
delete p;
*p = 5;      // 💥 野指针!释放后继续使用
🧱 情况三:返回局部变量地址
int* func() {int a = 10;return &a;  // 💥 返回了局部变量地址,出函数后地址无效
}

⚠️ 后果:

  • 访问野指针会导致:

    • 崩溃(如段错误 Segmentation fault
    • 难以定位的 bug
    • 数据破坏(写入非法内存)

🧹 2. 什么是内存泄漏(Memory Leak)?

内存泄漏是指:堆上分配的内存没有释放,导致程序运行中内存持续增长,最终可能导致系统资源耗尽。

✅ 典型例子:

🧱 忘记 deletefree
void func() {int* p = new int[100];  // 申请了 400 字节// 没有 delete[] p;// 💥 内存泄漏:程序离开后指针没释放,无法访问也无法回收
}
🧱 指针被覆盖,丢失引用
int* p = new int[50];
p = new int[100];  // 原来那 50 个 int 的内存地址丢了!

🔍 特点:

  • 不会立即崩溃,但内存会越来越多
  • 在服务端、长期运行程序中极其致命
  • 通常需借助工具(如 Valgrind、ASan)检测

📌 野指针 vs 内存泄漏

项目野指针内存泄漏
定义指向非法/不可用内存的指针分配的内存没有释放
后果崩溃、未定义行为、破坏数据内存占用不断上涨,可能撑爆系统
检测难度中等(ASan 可查)较难(Valgrind 常用)
处理方式初始化指针,置空,RAII使用智能指针,手动 delete

🛡️ 如何避免这两类问题?

✅ 避免野指针

  • 所有指针都要初始化,初始值设为 nullptr
  • delete 后立即置为 nullptr
  • 不返回局部变量地址
  • 使用智能指针(如 std::unique_ptrstd::shared_ptr

✅ 避免内存泄漏

  • 手动申请的内存要保证释放路径
  • 使用智能指针管理资源(RAII)
  • 用工具检测(Valgrind, AddressSanitizer)

✅ 总结一句话:

野指针 = 用了“坏掉”的指针;内存泄漏 = 忘了把申请的内存还回去。

两者都能造成严重后果,C++ 程序员必须养成良好的内存管理习惯。


http://www.dtcms.com/a/294488.html

相关文章:

  • 基于YOLOv5+pyQT6的目标检测系统通用项目模板
  • React中的antd的表格使用方法
  • HDFS写性能优化技巧详解:从理论到实践
  • HBase新手入门
  • kafka动态配置详解
  • Tile级原语与自动推理机制融合,TileAI社区发起人深度剖析TileLang核心技术与优势
  • 小白做投资测算,如何快速上手?
  • Hot100题解
  • iOS 抓包工具有哪些?2025实用指南与场景推荐
  • Docker 基础概念
  • 开源的语音合成大模型-Cosyvoice使用介绍
  • UE5多人MOBA+GAS 29、创建一个等级UI
  • Effective Python 第15条 不要过分依赖给字典添加条目时所用的顺序
  • Kafka的介绍
  • Linux 或者 Ubuntu 离线安装 ollama
  • windows 11 下git软件提交正常,idea git提交总提示需要token
  • Java设计模式-备忘录模式
  • 前缀和经典问题整理
  • 扫描电镜与透射电镜联用表征形貌与元素组成-测试GO
  • C语言(20250723)
  • Zookeeper基本功能和应用场景
  • Zookeeper学习专栏(八):使用高级客户端库Apache Curator
  • 【数据结构初阶】--树和二叉树先导篇
  • spring的value注解
  • 使用Qt下QAudioOutput播放声音
  • Google DeepMind发布MoR架构:50%参数超越传统Transformer,推理速度提升2倍
  • 网络安全威胁和防御措施
  • 水库大坝安全自动监测系统:守护水脉长城的智能防线
  • DDD领域驱动设计C++实现案例:订单管理系统
  • mysql 远程连接配置