内存相关风险
C语言中手动管理内存是许多严重运行时错误的根源。以下是最常见的七类内存错误。
坏指针错误(解引用未初始化指针):
- 未初始化的指针指向随机地址,对其解引用会导致不可预测的行为或段错误。
未初始化读取:
malloc分配的内存块内容未被清除,若在使用前未赋值就读取,会得到旧数据。
覆盖内存(缓冲区溢出):
- 写入的数据超出已分配块的边界,覆盖相邻块或栈上的返回地址。这是安全漏洞(如缓冲区溢出攻击)的主要来源。
引用不存在的变量:
- 函数返回后,其栈帧被释放,若通过指针访问该函数内的局部变量,结果是未定义的。
多次释放(double free):
- 对同一指针调用两次
free会破坏堆的数据结构,可能导致下一次分配返回错误的内存。
引用已释放的空闲块(dangling pointer):
free后继续通过原指针访问内存,此时该内存可能已被重新分配用于其他目的。
释放失败(内存泄漏):
- 动态分配的内存块未被释放,导致堆空间逐渐耗尽。长期运行的程序(如服务器)若不断泄漏内存最终会崩溃。
使用 valgrind 或 AddressSanitizer 等工具可以检测大部分内存错误。
链接到
- 上一个知识点:9.20 垃圾收集
- 下一个知识点:无(本章最后一个知识点)