内存泄露

什么是内存泄露

内存泄露是一种实现错误。它将会慢慢耗尽系统内存空间。当计算机运行进程的时候,可能需要或多或少的内存。这主要以来于进程每时每刻将要执行的命令。当进程需要更多的内存时,将给操作系统提出请求。当进程不再需要内存的时候,将会把内存释放掉,还给操作系统。这样其他进程才可以使用。如果进程没有正确的将内存还给操作系统,尽管它不再使用,但是内存的状态仍然是不可再分配。这将减少可用内存。

一般我们常说的内存泄露是指堆内存的泄露。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须释放的内存。应用程序一般使用mallocreallocnew等函数从堆中分配到一块内存,使用完后,程序必须负责相应得调用freedelete释放该内存块,否则,这块内存就不能再次被使用,我们就说这块内存泄露了。

对于一些界面的资源,如window的创建,menu的创建,dc的创建等等,对于这些,我们需要在不使用它们的时候,调用相应的函数,进行释放。否则也将会造成内存泄露。

内存泄露的后果

内存泄露会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

内存泄露可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂的应用程序中的内存泄露不会导致严重后果。

在以下情况下,内存泄露导致较严重的后果:

        一是程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);

        二是新的内存被频繁的分配,比如当现实电脑游戏或动画视频画面时;

        三是程序能够请求未被释放的内存(比如共享内存),甚至是程序终止的时候;

        四是泄露在操作系统内部发生;

        五是泄露在系统关键驱动中发生;

        六是内存非常有限,比如在嵌入式系统或便携设备中

       七是当运行于一个终止时内存并不自动释放的操作系统治上,而且一旦丢失,只能通过重启来恢复。

在这里,我着重强调一下嵌入式系统,由于系统内存非常有限,编写应用程序的时候,一定要防止内存泄露的发生。如果发生,可能是会使你编写的应用程序出现异常。或者你的系统的性能将会大大降低。甚至有时你不得不依靠重起系统来恢复。

内存泄露的检测
检测内存泄露的工具:debugnew
http://dev.csdn.net/article/58/58407.shtm
浅谈内存泄漏(二)
http://www.vczx.com/article/show.php?id=68

一个跨平台的 C++ 内存泄漏检测器

http://www-128.ibm.com/developerworks/cn/linux/l-mleak2/index.html
内存泄露检测
http://www.cppblog.com/Ipedo/archive/2005/10/27/867.aspx

你可能感兴趣的:(内存泄露)