Delphi服务应用程序TStringList LoadFromFile内存泄漏

时间:2014-11-18 04:47:45

标签: delphi memory-leaks tstringlist

那里有人可以解释为什么我的代码导致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

1 个答案:

答案 0 :(得分:0)

在查找代码中的泄漏之前,首先需要了解您是否真的有泄漏。任务管理器显示Windows对您的应用程序的了解,并且需要在Windows管理内存的背景下理解其编号 - 然后您必须了解Delphi如何在应用程序中管理内存。

要了解如何阅读任务管理器号码,我建议您使用优秀的Mark Russinovich的博客和视频:

http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

他将向您解释Windows中的内存分配是如何工作的(Delphi内存管理器然后对其进行子分配,但仍需要使用Windows内存分配调用),并且还将解释他的许多工具,这些工具可以让您更深入地了解Windows应用程序的许多内部工作方式 - 超出FastMM可以告诉您的范围。

还有一些名为“profilers”的工具可以跟踪内存分配和解除分配,并告诉您哪些代码分配内存,以后不会释放它。

否则你可能会追逐实际上不存在的泄漏......