随笔 - 809  文章 - 0 评论 - 144 阅读 - 770万

 

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   del88  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示