总听说内存泄露,到底是怎么回事啊?
在我的印象中,只要应用程序结束,所有的资源都会被还给OS。这是Delphi与VC最重要的区别之一。
欢迎指点,欢迎指教!
你可以批评我,但你一定要说清楚道理。

解决方案 »

  1.   

    我的观点是:操作系统中的“可用资源”在运行程序之前和关闭程序之后不一样并且是越来越少。
    不过有老大给我说那不是内存泄露,而是Windows管理的需要。
      

  2.   

    内存泄漏,我怎么觉得是程序的bug啊,就是程序启动后即使不操作也占用越来越多的内存,比如动态创建了很多的TBitmap对象,每次用完了友不Free,是不是就算是泄漏了啊。
      

  3.   

    所谓内存泄漏,指资源泄漏,例如:void F(T1*,T2*);f(new T1,new T2);编译器的工作为:
    1 为T1分配内存
    2 构造T1
    3 为T2分配内存
    4 构造T2
    5 调用f()
    当3、4中有一个失败,T1并未释放,这就是内存泄漏。
                        ---详细见《程序员》2003.4
      

  4.   

    Delphi在内存管理方面是很严谨的,只要遵循以下基本原则,内存溢出和泄露都可避免:
    (1)即用即毁防止内存溢出
    需要时才创建对象或申请内存,用完后即可释放对象或释放内存。用构造器Create创建的对象,需要直接或间接用析构器Destroy销毁;用New、GetMem申请的内存,需要分别用Dispose和FreeMem释放。
    (2)自创自毁防止内存泄露
    对于由Create创建的对象,如果他们的宿主直接或间接为Application,那么Delphi会保证它们在应用程序结束时全部被释放。但这并不意味着它们在程序运行中占用着内存,因此属于设计时就放置的对象,不需要关心其销毁,但对于运行时创建的对象,作为良好的习惯,一定要及时销毁。俺见到有些朋友喜欢写with TQuery.Create(nil) do try ... finally Free end;这样的代码,尽管也考虑了销毁,但这是存在销毁不成功的风险的。
      

  5.   

    啊,明白了,原来我一直就是概念不清楚啊。
    内存泄漏(即 malloc() 内存在对应的 free() 调用执行后永不被释放)本文将介绍内存泄漏的检测方法以及现在可以使用的工具。针对内存泄漏的问题,本文提供足够的信息,使我们能够在不同的工具中做出选择。 
    内存泄漏
    在此,谈论的是程序设计中内存泄漏和错误的问题,不过,并不是所有的程序都有这一问题。首先,泄漏等一些内存方面的问题在有的程序语言中是不容易发生的。这些程序语言一般都认为内存管理太重要了,所以不能由程序员来处理,最好还是由程序语言设计者来处理这些问题,这样的语言有Perl、Java等等。 然而,在一些语言(最典型的就是C和C++)中,程序语言的设计者也认为内存管理太重要,但必需由开发人员自己来处理。内存泄漏指的是程序员动态分配了内存,但是在使用完成后却忘了将其释放。除了内存泄漏以外,在开发人员自己管理内存的开发中,缓冲溢出、悬摆指针等其它一些内存的问题也时有发生。 
    问题缘何产生
    为了让程序能够处理在编译时无法预知的数据占用内存的大小,所以程序必需要从操作系统实时地申请内存,这就是所谓的动态内存。这时候,就会出现程序申请到内存块并且使用完成后,没有将其归还给操作系统的错误。更糟的情况是所获取的内存块的地址丢失,从而系统无法继续识别、定位该内存块。还有其它的问题,比如试图访问已经释放的指针(悬摆指针),再如访问已经被使用了的内存(内存溢出)的问题。 
    后果不容忽视
    对于那些不常驻内存的程序来说,由于执行过程很短,所以即使有漏洞可能也不会导致特别严重的后果。不过对于一些常驻内存的程序(比如Web服务器Apache)来说,如果出现这样的问题,后果将非常严重。因为有问题的程序会不断地向系统申请内存,并且不释放内存,最终可能导致系统内存耗尽而导致系统崩溃。此外,存在内存泄漏问题的程序除了会占用更多的内存外,还会使程序的性能急剧下降。对于服务器而言,如果出现这种情况,即使系统不崩溃,也会严重影响使用。 悬摆指针会导致一些潜在的隐患,并且这些隐患不容易暴发。它非常不明显,因此很难被发现。在这三种存在的问题形式中,缓冲溢出可能是最危险的。事实上,它可能会导致很多安全性方面的问题(一个安全的程序包含很多要素,但是最重要的莫过于小心使用内存)。正如上面所述,有时也会发生同一内存块被多次返还给系统的问题,这显然也是程序设计上的错误。一个程序员非常希望知道在程序运行的过程中,使用内存的情况,从而能够发现并且修正问题。 
    如何处理
    现在已经有了一些实时监测内存问题的技术。内存泄漏问题可以通过定时地终止和重启有问题的程序来发现和解决。在比较新的Linux内核版本中,有一种名为OOM(Out Of Memory )杀手的算法,它可以在必要时选择执行Killed等程序。悬摆指针可以通过定期对所有已经返还给系统的内存置零来解决。解决内存溢出问题的方法则多种多样。