内存相关风险

C语言中手动管理内存是许多严重运行时错误的根源。以下是最常见的七类内存错误。

坏指针错误(解引用未初始化指针)

  • 未初始化的指针指向随机地址,对其解引用会导致不可预测的行为或段错误。

未初始化读取

  • malloc 分配的内存块内容未被清除,若在使用前未赋值就读取,会得到旧数据。

覆盖内存(缓冲区溢出)

  • 写入的数据超出已分配块的边界,覆盖相邻块或栈上的返回地址。这是安全漏洞(如缓冲区溢出攻击)的主要来源。

引用不存在的变量

  • 函数返回后,其栈帧被释放,若通过指针访问该函数内的局部变量,结果是未定义的。

多次释放(double free)

  • 对同一指针调用两次 free 会破坏堆的数据结构,可能导致下一次分配返回错误的内存。

引用已释放的空闲块(dangling pointer)

  • free 后继续通过原指针访问内存,此时该内存可能已被重新分配用于其他目的。

释放失败(内存泄漏)

  • 动态分配的内存块未被释放,导致堆空间逐渐耗尽。长期运行的程序(如服务器)若不断泄漏内存最终会崩溃。

使用 valgrind 或 AddressSanitizer 等工具可以检测大部分内存错误。

链接到

  • 上一个知识点:9.20 垃圾收集
  • 下一个知识点:无(本章最后一个知识点)