内存泄漏(memory leak)

来源:转载

 

1.定义

 

as wikipedia says,A memory leak, in computer science (or leakage, in this context), occurs when a computer program consumes memory but is unable to release it back to the operating system. Inobject-oriented programming, a memory leak happens when an object is stored in memory but cannot be accessed by the running code.

 

如维基百科所说,内存泄漏是指程序消耗了内存却无法释放,还给操作系统。在面向对象编程中,内存泄漏发生在一个对象存储在内存中却无法在运行时访问它。有时候内存泄漏也指不断增加的内存消耗。

 

2. 内存泄漏原因(摘自http://www.open-china.net/blog/76214.html)

 

内存泄漏的原因主要有三点:

 

1)    分配完内存之后忘了回收;

 

2)    程序Code有问题,造成没有办法回收;

 

3)    某些API函数操作不正确,造成内存泄漏。

 

1) 内存忘记回收,这个是不应该的事情。但是也是在代码种很常见的问题。分配内存之后,用完之后,就一定要回收。如果不回收,那就造成了内存的泄漏,造成内存泄漏的Code如果被经常调用的话,那内存泄漏的数目就会越来越多的。从而影响整个系统的运行。比如下面的代码:

 

for (int =0;I<100;I++)

 

{

 

 Temp = new BYTE[100];

 

}  就会产生 100*100Byte的内存泄漏。

 

2) 在某些时候,因为代码上写的有问题,会导致某些内存想回收都收不回来,比如下面的代码:

 

Temp1 = new BYTE[100];

 

Temp2 = new BYTE[100];

 

Temp2 = Temp1;

 

这样,Temp2的内存地址就丢掉了,而且永远都找不回了,这个时候Temp2的内存空间想回收都没有办法。

 

3). API函 数应用不当,在Windows提供API函数里面有一些特殊的API,比如FormatMessage。 如果你给它参数中有FORMAT_MESSAGE_ALLOCATE_BUFFER,它会在函数内部New一块内存Buffer出来。但是这个 buffer需要你调用LocalFree来释放。 如果你忘了,那就会产生内存泄漏。

 

3. 内存泄漏检测

 

IBM Rational Purify,BoundsChecker,Valgrind,Insure++等是常用的内存检测工具。

 

在linux下面,gdb自带了一些内存检测函数,如mcheak(),mtrace(),mpr,Electric Fence。

 

具体这些工具怎么用,有待进一步学习。

分享给朋友:
您可能感兴趣的文章:
随机阅读: