内存溢出和内存泄露的概念、原因和解决方法

11. 什么是内存溢出和内存泄露?
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存new/malloc后,无法释放delete/free已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!

12. 导致内存泄漏原因?
(1) 程序循环new创建出来的对象没有及时的delete掉,导致了内存的泄露;
(2) delete掉一个void*类型的指针,导致没有调用到对象的析构函数,析构的所有清理工作都没有去执行从而导致内存的泄露;
(3) new创建了一组对象数组,内存回收的时候却只调用了delete而非delete []来处理,导致只有对象数组的第一个对象的析构函数得到执行并回收了内存占用,数组的其他对象所占内存得不到回收,导致内存泄露;
13. 导致内存溢出原因?
(1) 内存分配未成功,却使用了它。
(2) 内存分配尽管成功,可是尚未初始化就引用它。
(3) 内存分配成功而且已经初始化,但操作越过了内存的边界。
(4) 使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。
(5) 程序中的对象调用关系过于复杂,实在难以搞清楚某个对象到底是否已经释放了内存,此时应该又一次设计数据结构,从根本上解决对象管理的混乱局面
(6) 忘记为数组和动态内存赋初值,导致未被初始化的内存被作为右值使用。

14. 内存溢出和内存泄露解决方法?
内存溢出:
(1) 避免上面所说的导致内存溢出原因
(2) 在使用内存之前检查指针是否为NULL。假设指针p 是函数的參数,那么在函数的入口处用assert(p!=NULL)进行检查。假设是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。
内存泄露:
(1) 良好的编码习惯,尽量在涉及内存的程序段,检測出内存泄露。
(2) 重载 new 和 delete。将分配的内存以链表的形式自行管理,使用完成之后从链表中删除,程序结束时可检查改链表,当中记录了内存泄露的文件
(3) 使用智能指针。
(4) 一些常见的工具软件BoundsChecker,它主要定位程序运行时期发生的各种错误。
(5) 调试运行DEBUG版程序,运用以下技术:CRT(C run-time libraries)、运行时函数调用堆栈、内存泄漏时提示的内存分配序号(集成开发环境OUTPUT窗口),综合分析内存泄漏的原因,排除内存泄漏。

参考:
https://blog.csdn.net/Clever_Pig/article/details/75050398
https://blog.csdn.net/buutterfly/article/details/6617375
https://blog.csdn.net/qq_18824491/article/details/78902636

你可能感兴趣的:(计算机基础)