一般指堆的内存泄漏,简单来说就是已申请的内存空间没有被正确释放。
避免内存泄露的几种方式
- 计数法:使用new或者malloc时,让该数+1,delete或free时,该数-1,程序执行完打印这个计数,如果不为0则表示存在内存泄露
- 一定要将基类的析构函数声明为虚函数
- 对象数组的释放一定要用delete []
- 有new就有delete,有malloc就有free,保证它们一定成对出现
检测工具
- Linux下可以使用Valgrind工具
- Windows下可以使用CRT库
在 Linux 或 macOS 下,有多种工具可以用来检测内存泄漏。以下是一些常用的方法:
- mtrace:mtrace 是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。mtrace 的基本设计原理为设计一个函数
void mtrace()
,函数对 libc 库中的malloc/free
等函数的调用进行追踪,由此来检测内存是否存在泄漏的情况。使用 mtrace 时,需要在代码中包含<mcheck.h>
,并在程序开始时调用mtrace()
,在程序结束时调用muntrace()
。同时,需要设置环境变量MALLOC_TRACE
来指定日志文件的路径。
#include <mcheck.h>
#include <stdlib.h>
int main() {
mtrace(); // 开始跟踪
char *p = (char *)malloc(100);
free(p);
p = NULL;
p = (char *)malloc(100);
muntrace(); // 结束跟踪,并生成日志信息
return 0;
}
-
Valgrind1:Valgrind 是一套开源的仿真调试工具集合,其中的 Memcheck 工具可以用来检测程序中出现的内存问题,包括内存泄漏。使用 Valgrind 进行内存泄漏检测时,只需要在命令行中使用
valgrind --leak-check=yes your_program
命令运行你的程序即可。 -
ps 命令2:在 Linux 平台,可以使用 ps 命令来监视内存的使用,观测指定进程的 VSZ 值,从而发现可能的内存泄漏。