常见现象
C 内存问题经常表现得很绕:崩溃点不一定是出错点,今天能复现的问题明天可能消失,打开日志后问题也可能变化。
常见类型包括:
- 数组或缓冲区越界
- 使用已经释放的指针
- 重复释放
- 未初始化读取
- 资源泄漏
先缩小范围
不要一开始就盯着崩溃现场。先确认最近改动、输入数据规模、线程数量、编译优化级别和是否只在特定平台出现。
如果问题能稳定复现,优先构造最小复现用例。
检查边界
内存越界通常和长度计算有关。重点检查:
- 缓冲区大小是否包含结尾
\0 memcpy长度是否来自可信来源- 循环边界是否使用
<而不是误用<= - 结构体长度和协议字段是否一致
检查生命周期
悬空指针来自对象生命周期结束后继续访问。释放后可以把指针置为 NULL,但这只能减少部分误用,不能替代清晰的所有权设计。
小结
排查内存问题要有耐心,也要有方法。先稳定复现,再缩小范围,最后回到边界、生命周期和错误路径。