1.37、野指针和内存泄漏是什么?如何避免?

野指针(Wild Pointer)

定义:指针未初始化或指向已释放的内存区域,因而指向一个不确定的、非法的内存地址。使用野指针访问内存会导致未定义行为,程序可能崩溃或产生不可预期的结果。

产生原因

  • • 指针声明后未初始化即使用。
  • • 指针指向的对象已被释放(悬挂指针)。
  • • 指针被错误赋值为无效地址。

避免方法

  • • 指针声明时进行初始化,指向合法内存或赋值为nullptr
  • • 动态分配内存后确保指针指向有效地址。
  • • 释放内存后立即将指针置为nullptr,避免悬挂。
  • • 使用智能指针(如std::unique_ptrstd::shared_ptr)自动管理生命周期。

内存泄漏(Memory Leak)

定义:程序动态分配的内存未被释放,且程序中不再持有指向该内存的指针,导致这部分内存无法回收,造成系统资源浪费,严重时会导致程序性能下降甚至崩溃。

产生原因

  • • 动态分配内存后未调用对应的释放操作(delete/delete[]free)。
  • • 指针被覆盖或丢失,导致无法访问原有内存。
  • • 复杂数据结构中未正确释放所有节点。

避免方法

  • • 使用智能指针自动管理动态内存,避免手动释放错误。
  • • 对动态数组使用delete[],避免只调用delete
  • • 避免不必要的堆内存分配,优先使用栈或容器类(如std::vector)。
  • • 使用内存检测工具(如Valgrind、AddressSanitizer)定位泄漏。
  • • 养成良好资源管理习惯,确保每个new对应一个delete

总结

问题 本质 主要风险 关键避免策略
野指针 指针指向非法内存 程序崩溃、未定义行为 初始化指针、释放后置空、智能指针
内存泄漏 动态内存未释放且不可访问 内存占用增长、性能下降、崩溃 智能指针管理、配对释放、检测工具

本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

 

阅读剩余
THE END