内存泄漏

12 篇文章 1 订阅
11 篇文章 0 订阅

一、什么是内存泄漏
由于内存管理失败导致堆内存忘记释放或者无法释放,导致堆内存无法循环使用的情况叫做内存泄漏
注意:当程序结束后所有的资源都会被系统回收,包括泄漏的内存

二、内存泄漏的原因
1、C语言中malloc/free函数不匹配(忘记写free或者没有执行到free),在C++中类的构造函数和析构函数中没有匹配的调用new和delete函数

2、 在释放对象数组时在delete中没有使用方括号
如果没有方括号,那么这个指针就被默认为只指向一个对象,对象数组中的其他对象的析构函数就不会被调用,结果就会造成了内存泄露。如果在方括号中间放了一个比对象数组大小还大的数字,那么编译器就会调用无效对象(内存溢出)的析构函数,会造成堆的奔溃。如果方括号中间的数字值比对象数组的大小小的话,编译器就不能调用足够多个析构函数,结果会造成内存泄露

3、没有将基类的析构函数定义为虚函数
当基类指针指向子类对象时,如果基类的析构函数不是虚函数,那么子类的析构函数将不会被调用,子类的资源没有正确的释放,就会造成内存泄漏

4、缺少拷贝构造函数
在C++中如果没有定义拷贝构造函数,那么编译器就会就会调用默认的拷贝构造,这种拷贝构造是浅拷贝,如果类成员中有指针成员时,那么浅拷贝就只拷贝指针变量的值,所以当释放第一个对象的时候,它的析构函数就会释放这个指针所指向的内存,当释放第二个对象的时候,会再次释放这个指针所指向的内存,那么就会造成内存泄漏

5、没有正确地清除嵌套的对象指针

三、如何避免内存泄漏
1、尽量使用栈内存
2、不要频繁的申请和释放内存
3、malloc与free匹配使用
4、通过new[]创建的对象,一定要通过delete[]释放
5、写上拷贝构造函数
6、将基类的析构函数定义为虚函数
7、使用智能指针

四、内存泄漏的检测工具
Valgrind
1、gcc –g xxx.c
加入-g参数的目的是为了定位在第几行
2、valgrind --tool=memcheck --leak-check=full ./a.out
执行完这条命后会出现一长串东西,首先搜关键字 LEAK SUMMARY ,看 definitely lost 对应是否有值,如果不为 0,肯定有内存泄露 ,如果有内存泄露,往上搜报告中 definitely lost in loss 的报警处,对照程序代码一一排查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值