内存泄漏示例:为什么不释放会出问题
副标题 / 摘要 内存泄漏会让程序“越跑越慢”。本文用 C 示例展示泄漏原因,并给出基本规避方法。 目标读者 写过 C/C++ 的开发者 关注资源管理与稳定性的工程师 学习系统编程的读者 背景 / 动机 在手动内存管理语言中,忘记释放会导致内存逐渐耗尽。 长期运行服务最容易遭遇此类问题。 核心概念 内存分配:malloc/new 释放:free/delete 泄漏:分配后没有释放且失去引用 实践指南 / 步骤 所有分配都必须有对应释放 明确资源的所有权 使用工具检测泄漏(valgrind) 用 RAII 或智能指针减少风险 可运行示例 #include <stdlib.h> #include <stdio.h> int main() { for (int i = 0; i < 100000; i++) { char *p = (char *)malloc(1024); if (p == NULL) return 1; // 忘记 free(p); -> 内存泄漏 } printf("done\n"); return 0; } 解释与原理 每次 malloc 都会向堆申请内存,如果不释放,内存不会回收。 循环中持续泄漏最终会导致内存耗尽。 常见问题与注意事项 垃圾回收语言就不会泄漏吗? 也可能“逻辑泄漏”,比如全局容器无限增长。 为什么泄漏很难发现? 因为短期运行可能看不出问题。 工具有用吗? 非常有用,建议上线前检查。 最佳实践与建议 用智能指针或 RAII 自动释放 对长期运行服务做内存监控 建立内存泄漏回归测试 小结 / 结论 内存泄漏是资源管理失控的典型问题。 通过明确所有权与工具检测,可以显著降低风险。 ...