1、delphi dispose 释放内存的方法 一、定义一个record 类型 经过多次 new dispose 后, 从windows 任务管理器看, 占用的内存比启动时 大了很多,似乎越来越大 。 二、设置 ReportMemoryLeaksOnShutdown := true 再运行, 仍然没有提示 memory leak。 其实就是 dispose 本身的原因。 delphi 设计的 dispose 释放内存时, 只是标记这部分内存可以再用来被 new 等函数分 配, 并不是把从系统申请到的内存归还给操作系统, 只在程序结束时, 才全部释 放给操作系统。比如 new 申请 15 个记录(
2、sizeof=64 字节) 的空间,然后 dispose 释放。再使用 new 申请 10 个,此时这 10 个就不再请求系统了,直 接从刚才的 15 个 (此时已经空闲) 中分10 个出来。只有在占用的空闲内存不 够使用时, 才请求操作系统分配内存 (剩余部分) 。 若前一次 15 个空间地址如左 列,释放后,下一次 10 个空间的地址如右列 ,即从前次分配的最后一个地址开 始,按前次的顺序,倒过来分配 10 个。 00F23860 00F23470 00F23818 00F234B8 00F237D0 00F23500 00F23788 00F23548 00F23740 00F23590
3、 00F236F8 00F235D8 00F236B0 00F23620 00F23668 00F23668 00F23620 00F236B0 00F235D8 00F236F8 00F23590 00F23548 00F23500 00F234B8 00F23470 注: 简单介绍一下: 若有如下类型定义,可以使用 new 申请空间,并在使用完 后使用dispose 释放。 Type PMyRec = TMyRec; TMyRec = record FName: string; LName: string; end; var MyRecPtr: PMyRec; TreeViewIndex: LongInt; begin New(MyRecPtr); MyRecPtr.FName := Edit1.Text; MyRecPtr.LName := Edit2.Text; 其他处理 Dispose(MyRecPtr); end;