现在我的程序存在内存泄漏问题,请问如何在程序中查找在什么位置存在内存泄漏

解决方案 »

  1.   

    查找new 和Create ,找到的变量都查找一下有没有free, 可以判断出来
      

  2.   

    delphi 本身就存在内存泄漏的问题,但是对开发者而言,要养成创建了就要释放的习惯。多查找一下你的 create 、 new
      

  3.   

    哪位大虾知道怎么用MemProof查程序的内存泄漏吗?
      

  4.   

    有BoundCheck for Delphi,但是使用有一点麻烦,要使用Delphi的debug版本dcu编译,还要设置路径,最后查出来泄漏的地方又多得要命,(很多其实是Delphi自己管理的,也说不清是Delphi的bug还是BoundCheck查得太严了)。还有一个办法,是逐一屏蔽可疑的功能模块,查看内存,gdi等的占用率,如有明显增加,就可以初步判定泄漏的位置。还有就是对于需要频繁分配内存的地方,建议自己预先分配一定量的内存,然后自己管理,而不要使用GetMem,可以避免一些内存碎片,也可提高速度。不过最主要的是规范和好的算法。
      

  5.   

    给你一些有用的建议:1、内存释放不完整,有时候是对Delphi的VCL不熟悉造成的,要仔细的看Help,确定如何释放你的对象,不同的分配函数,释放是不同的,比如你用GetMem对一个PChar指针分配内存和用AllocStr分配是有区别的。2、要记住原则,你分配的内存必须自己释放。3、有些情况例外:接口的引用,不需要你关心,你只需要创建你需要的接口对象,怎么释放,何处释放不需要你关心。用SetLength分配的动态数组和字符串不需要你手工的释放。但是动态数组成员是一个指针或者结构包含指针,他指向的动态分配的内存区块,那么你需要自己创建,自己释放。4、有些情况,不需要你管理,比如你使用TObjectList,并且创建的时候指出,TObjectList自己管理存储在它里面的对象,那么这些对象,TObjectList会帮你销毁。5、使用某些API的时候要注意,一方面是你传递给他的内存,不能够在他执行的时候被释放,比如一些非阻塞运行的API,还有,Delphi的编译器会自动的产生销毁不再引用的字符串,你传递这个字符串给API,那么可能引起故障。你必须标明仍然使用,最常见的就是用SetLength分配一个副本,这个副本,直到你自己的函数退出,并且无引用的时候才会释放。6、最为关键的一点就是,你的程序随时可能出现异常,这会打乱你的程序的执行顺序,这时候,就会直接回退函数,而不经过你释放内存的代码,要防止这种情况,你应该恰当的使用
    try
    except
    或者
    try
    finally不过你不必为你在堆栈中分配的内存有任何忧虑,堆栈中的变量、结构你都可以认为会自动的释放,其实并存在所谓的释放,呵呵。Delphi中没有任何主动分配内存的函数可以在堆栈上面分配内存。