1

使用 Delphi 10.4.1 我尝试了自定义托管记录管理来初始化记录,但仍然出现内存泄漏。

unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, System.IOUtils, System.DateUtils, System.Character,
  Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

type
  TMyRec = record
    DateTime: TDateTime;
    v, size: integer;
    str: string;
    class operator Initialize (out Dest: TMyRec);
  end;

  TMyREcHolder = class
    data: TMyRec;
    constructor Create(const e: TMyRec);
  end;

  TMyList = class(TList)
    procedure Clear; override;
  end;

implementation

{$R *.dfm}

class operator TmyRec.Initialize (out Dest: TMyRec);
begin
  Dest.str := '';
end;

{ TMyREcHolder }


constructor TMyREcHolder.Create(const e: TMyRec);
begin
  inherited Create;
  data := e;
end;

{ TMyList }

procedure TMyList.Clear;
var
  i: integer;
begin
  for i := 0 to Count - 1 do
    TMyREcHolder(Items[i]).Free;
  inherited Clear;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  lst: TMyList;
  i: integer;
  rec: TMyRec;
  FI: TSearchrec;
begin
  Initialize(rec);
  lst := TMyList.Create;
  try
    if FindFirst(TPath.Combine('C:\temp', '*.txt'), faAnyFile, FI) = 0 then
    begin
      repeat
        if (FI.FindData.dwFileAttributes and faDirectory = 0) and
          (FI.FindData.dwFileAttributes and faArchive = faArchive) then
        begin
          Application.ProcessMessages;
          case RadioGroup1.ItemIndex of
            0: Initialize(rec);
            1: rec.str := '';
            2: fillchar(rec, sizeof(rec), 0);
          end;
          try
            rec.DateTime := FI.TimeStamp;
          except
            rec.DateTime := EncodeDateDay(1970, 1);
          end;
          rec.size := FI.size;
          rec.str := FI.Name;
          lst.Add(TMyREcHolder.Create(rec));
        end;
      until (FindNext(FI) <> 0);
      FindClose(FI);
    end;
  finally
    lst.Free;
  end;
end;

end.

radiogroup 提供三个项目,1 和 3 泄漏内存。任何人都可以解释为什么初始化一个吗?我想要一种可靠的清除记录的方法来帮助我摆脱 20 年的 fillchar 习惯。

4

0 回答 0