内存泄露

       一般我们常说的内存泄露是指堆内存的泄露,堆内存是指程序从堆中分配的,大小任意的(内存大小可以在程序运行期间决定),使用完之后必须显式的释放。应用程序一般使用malloc,realloc,new等从堆内存中分配得到一块内存,使用完时候,程序必须负责相应的free,和delete释放该内存,否则,这块内存就不能被再次使用,我们就说这块内存被泄露了。

   广义的说,内存泄露不仅仅包含堆内存的泄露,还包括系统资源的泄露(resource leak),比如核心态HANDLE,GDI,Object,SOCKET,Interface等,从根本上说这些由操作系统分配的对象也消耗内存,如果这些对象发生泄露最终也会导致内存泄露。而且,某些对象消耗的是核心态的内存,这些对象严重泄漏会导致整个操作系统的不稳定。相比之下,系统资源的泄露比堆内存的泄露更为严重。

  内存泄露的放生方式  :  主要分为4类

1、常发性内存泄露。发生内存泄露的代码会被多次执行到,每次执行都会导致一块内存泄露。

2、偶发性内存泄露。发生内存泄露的代码只有在某些特定的环境或是操作过程中才会发生。

3、一次性内存泄露。发生内存泄露的代码只会被执行一次,或者由于算法的缺陷,导致总会有一块仅且一块内存发生泄漏。

4、隐式内存泄露。程序在运行过程中不断地分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄露,因为程序最终会释放所有申请的内存。但是对于一个服务器程序,需要运行几天,几周,甚至几个月,不及时的释放掉内存也可能导致最终耗尽系统左右的内存。所以我们称这种内存泄露为隐式内存泄露。

  从用户的角度来讲,内存泄露本身不会有什么危害,作为一般的用户,根本感觉不到内存泄露的存在。真正危害的是内存泄露的堆积,这最终会耗尽系统的所有内存。从这个角度讲,一次性内存泄露并没有什么危害,因为他不会堆积,而隐式的内训泄露危害最大,因为较之常发性和偶发性的内训泄露,它更难被检测到。

  内存泄露的检测

 检测内存泄露关键是要截获内存分配,内存释放的函数的调用。跟踪每一块内存的生命周期。比如,每当我们分配一块内存后,就把他的指针加入到一个全局的list中,每当释放一块内存,再把它的指针从list中删除。这样当程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存。

原文地址:https://www.cnblogs.com/newpanderking/p/3826732.html