内存泄漏通常是因为调用了malloc/new等内存申请操作,但是缺少了对应的free/delete。
可以用Linux环境下的内存泄漏检查工具Valgrind;
或者写代码时,添加内存申请和释放的统计功能,统计当前申请和释放内存是否一致;
使用Boost库的智能指针。
内存泄漏分类:
- 堆内存泄漏:没有free/delete释放
2.系统资源泄漏:主要指程序使用系统分配的资源比如 Bitmap,handle,SOCKET等没有使用相应的函数释放掉 - 没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确的释放,从而造成内存泄漏。
内存泄漏工具Valgrind
检查内存泄漏工具---memcheck,这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等
指令:valgrind --tool=memcheck --leak-check=full ./test
Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。
Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。
Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处。