1.什么是内存泄漏
1.内存泄漏的定义
内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
2.发生的危害
只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。 更糟的是,泄漏的程序可能会用掉太多内存,以致另一个程序失败,而使用户无从查找问题的真正根源。 此外,即使无害的内存泄漏也可能是其他问题的征兆。
在以下情況,内存泄漏导致较严重的后果:
·程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
·新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
·程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
·泄漏在操作系统内部发生;
·泄漏在系统关键驱动中发生;
2.c++ 中避免内存泄漏应该注意的问题
1、不要手动管理内存,可以尝试在适用的情况下使用智能指针。
2、使用string而不是char*。
string类
在内部处理所有内存管理,而且它速度快且优化得很好。
3、除非要用旧的lib接口,否则不要使用原始指针。
4、在C++中避免内存泄漏的最好方法是尽可能少地在程序级别上进行new和delete调用–最好是没有。任何需要动态内存的东西都应该隐藏在一个RAII对象中,当它超出范围时释放内存。RAII在构造函数中分配内存并在析构函数中释放内存,这样当变量离开当前范围时,内存就可以被释放。
(注:RAII资源获取即初始化,也就是说在构造函数中申请分配资源,在析构函数中释放资源)
5、使用了内存分配的函数,要记得使用其想用的函数释放掉内存。可以始终在new和delete之间编写代码,通过new关键字分配内存,通过delete关键字取消分配内存。
6、培养良好的编码习惯,在涉及内存的程序段中,检测内存是否发生泄漏。