DebugHook 与 ReportMemoryLeaksOnShutdown 都是 System 下的变量.



DebugHook: 程序中母体中运行时, 此值是 1; 独立运行时, 它是 0.



在程序的任何地方加上一句 ReportMemoryLeaksOnShutdown := True;
这样程序在关闭时可检测是否有内存泄漏.



如果这样使用: ReportMemoryLeaksOnShutdown := Boolean(DebugHook);
则程序只会在调试时报内存泄漏.

ReportMemoryLeaksOnShutdown

放置ReportMemoryLeaksOnShutdown的最佳位置是程序的dpr文件中,例如:

 

begin
ReportMemoryLeaksOnShutdown := DebugHook <> 0; 
//source "by" Delphi 
   Application.Initialize; 
   Application.MainFormOnTaskbar := True; 
   Application.CreateForm(TMainForm, MainForm) ; 
   Application.Run; 
end.

 

使用全局变量DebugHook的作用是确保程序在debug模式运行时显示内存泄露报告。但是注意在正常模式运行是不会报错的。

Test Drive: Memory Leak Detection

 

var
   sl : TStringList; 
begin
   sl := TStringList.Create; 
   sl.Add('Memory leak!') ; 
end;

 

上述代码就是实际测试内存泄露报告效果。

避免这种内存泄露的发生就是使用free方法,用nil不能释放内存。

--------------------------------------------------------------------------------------------------------------------

最终我总结用和上面的方法结合:

begin
  {还更容易理解,加在程序的工程处,不用每个单元都引用了}
  ReportMemoryLeaksOnShutdown := Boolean(DebugHook);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

 

补充:用了上面的代码之后,调试程序出来一个警告

posted on 2013-04-22 10:08  del88  阅读(158)  评论(0)    收藏  举报