内存泄漏(Memory Leak)是什么?
内存泄漏是指程序在运行过程中动态分配了内存(如使用 malloc、new 等)但未正确释放,导致这部分内存无法被再次使用。随着程序运行时间增长,泄漏的内存会累积,最终可能耗尽系统资源,引发性能下降或崩溃。
内存泄漏的分类
(1)堆内存泄漏 (Heap leak)
对内存指的是程序运⾏中根据需要分配通过malloc,realloc new等从堆中分配的⼀块内存,再是完成后必须通过调⽤对应的 free或者 delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使⽤,就会产⽣ Heap Leak.
(2)系统资源泄露(Resource Leak)
主要指程序使⽤系统分配的资源⽐如 Bitmap,handle ,SOCKET 等没有使⽤相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运⾏不稳定。
(3)没有将基类的析构函数定义为虚函数
当基类指针指向⼦类对象时,如果基类的析构函数不是 virtual,那么⼦类的析构函数将不会被调⽤,⼦类的资源没有正确是释放,因此造成内存泄露。
常见原因:
未释放动态分配的内存:例如在 C/C++ 中调用 new 后未调用 delete。
循环引用:在带有引用计数的语言中,对象互相引用导致无法释放。
全局变量或静态集合长期持有对象
未关闭资源:如文件句柄、数据库连接未释放,虽然不是严格的内存泄漏,但会导致类似问题。
如何检测内存泄漏?
1. 使用工具检测
C/C++:
Valgrind(Linux/macOS):通过 valgrind --leak-check=full ./your_program 分析内存泄漏。
AddressSanitizer(ASan):GCC/Clang 的编译选项,检测内存错误。
Visual Studio 调试器(Windows):内置内存泄漏检测工具(需启用 _CrtDumpMemoryLeaks())。
2. 代码审查
检查所有动态分配的内存(如 malloc、new)是否都有配对的释放操作。
关注长生命周期对象(如单例、静态变量)是否持有无用引用。
3. 日志与监控
在关键代码段记录内存分配和释放的日志。
监控程序运行时内存占用(如 top、htop 或语言内置的 memory_profiler)。
如何防止内存泄漏?
1. 使用自动内存管理
智能指针(C++):如 std::unique_ptr(独占所有权)和 std::shared_ptr(共享所有权,需避免循环引用)。
2. 规范编码习惯
谁分配,谁释放:确保每个 new 对应一个 delete,或使用智能指针。
避免裸指针:在 C++ 中优先使用容器(如 std::vector)和智能指针。
3. 避免循环引用
弱引用(Weak Reference):在需要循环引用的场景使用弱引用(如 C++ 的 std::weak_ptr)。
4. 静态代码分析工具
使用工具如 Clang Static Analyzer(C/C++)提前发现潜在问题。
5. 单元测试与压力测试
编写测试用例,模拟长时间运行或高频操作,观察内存是否稳定。

被折叠的 条评论
为什么被折叠?



