C 语言内存泄漏与悬垂指针
更新时间:2026-08-26。本文是
languages/c/主题高手层的骨架文档(占位),完整展开将在后续批次补齐。
本文要回答的问题
- 泄漏和悬垂指针是一回事吗?哪个更隐蔽?
- C 没有 GC,怎么管好 malloc/free 的"所有权"?
- 长期跑的服务内存只涨不跌,怎么定位?
一、两类经典内存错误
| 问题 | 现象 | 根因 |
|---|---|---|
| 内存泄漏 | 内存只涨不跌(RES 单调上升) | malloc 后没 free,指针丢失 |
| 悬垂指针 | 时好时坏、随机崩溃 | free 后仍持有指针并解引用 |
| use-after-free | 数据被改写、偶发错误 | 释放后对象被复用再读写 |
泄漏是"慢性病",悬垂指针是"急性发作"——后者更难复现,也更危险。
二、所有权约定:谁分配谁释放
C 靠约定管理资源,常见模式:
- 谁 malloc 谁 free:函数内分配、函数内释放,职责单一。
- 返回堆对象:文档注明调用方负责
free(如strdup的调用方)。 - 借用不拥有:只读别人传进来的指针,不负责释放。
- 对应到 C++ 就是 RAII,C 里用手工约定 + 命名习惯(如
create_xxx/destroy_xxx)。
三、检测与排查
- Valgrind:
valgrind --leak-check=full ./prog报泄漏点与栈,见 Valgrind 内存检测。 - ASan:
-fsanitize=address抓 use-after-free、越界,见 ASan 内存检测。 - 监控:
top//proc/<pid>/status的 VmRSS 趋势,见 free 与 vmstat。
四、与入门层的衔接
一句话总结
泄漏是忘了还、悬垂是还了又用:立好"谁分配谁释放"的所有权约定,配 Valgrind/ASan 兜底,长期服务才不会死在内存上。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。