自定义托管记录和内存泄漏

问题描述

使用 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 泄漏内存。谁能解释一下为什么 Initialize 会这样做?我想要一种清除记录的可靠方法,以帮助我摆脱 20 年的填充习惯。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)