内存泄漏(memory leak)
2011-08-02 09:40 悠悠白云 阅读(377) 评论(0) 收藏 举报
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。
浙公网安备 33010602011771号