那里有人可以解释为什么我的代码导致4KB的内存泄漏,查看TaskManager。 Delphi 2005,服务应用程序:
unit uMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls;
type
TgwDebugService_s = class(TService)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceExecute(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
gwDebugService_s: TgwDebugService_s;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
gwDebugService_s.Controller(CtrlCode);
end;
function TgwDebugService_s.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TgwDebugService_s.ServiceExecute(Sender: TService);
begin
// Service is Fired
while not Terminated do
ServiceThread.ProcessRequests(True);// wait for termination
end;
procedure TgwDebugService_s.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
// Service stops
end;
procedure TgwDebugService_s.Timer1Timer(Sender: TObject);
var
sl : TStringList;
begin
Timer1.Enabled := False;
Sleep(1000);
sl := TStringList.Create;
try
//if FileExists( 'c:\OnlyOnMyPc\test.txt' ) then
sl.LoadFromFile( 'c:\OnlyOnMyPc\test.txt' ); // remove this line and will be find
sl.Add( 'Test @ ' + FormatDateTime( 'dd.mm.yyyy hh:mm:ss.z', Now ) );
sl.SaveToFile( 'c:\OnlyOnMyPc\test.txt' );
finally
sl.Clear;
FreeAndNil( sl );
end;
Timer1.Enabled := True;
end;
end.
感谢您的时间和帮助。
干杯。 GBP
答案 0 :(得分:0)
在查找代码中的泄漏之前,首先需要了解您是否真的有泄漏。任务管理器显示Windows对您的应用程序的了解,并且需要在Windows管理内存的背景下理解其编号 - 然后您必须了解Delphi如何在应用程序中管理内存。
要了解如何阅读任务管理器号码,我建议您使用优秀的Mark Russinovich的博客和视频:
http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
他将向您解释Windows中的内存分配是如何工作的(Delphi内存管理器然后对其进行子分配,但仍需要使用Windows内存分配调用),并且还将解释他的许多工具,这些工具可以让您更深入地了解Windows应用程序的许多内部工作方式 - 超出FastMM可以告诉您的范围。
还有一些名为“profilers”的工具可以跟踪内存分配和解除分配,并告诉您哪些代码分配内存,以后不会释放它。
否则你可能会追逐实际上不存在的泄漏......