代码改变世界

内存泄漏(memory leak)

2011-08-02 09:40  悠悠白云  阅读(377)  评论(0)    收藏  举报

1.定义

as wikipedia says,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 PurifyBoundsCheckerValgrindInsure++等是常用的内存检测工具。

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

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