delphi - 在delphi中释放多个对象

标签 delphi

在下面,我插入了 Ray Konopka 编写的代码(Coderage 演示文稿的一部分)。我打算使用它,但是,我不确定如何(即时)清理多个对象。 我所有的尝试都不成功,并导致内存泄漏。 任何想法表示赞赏。 谢谢,

  program stringlistDictionary;

{$APPTYPE CONSOLE}

uses
 Classes,
 SysUtils;

 type
   TPlayer = class
  public
   Name: string;
   Position: string;
   Hits: Integer;
   AtBats: Integer;
   constructor Create( Name, Position: string );
 end;


   constructor TPlayer.Create( Name, Position: string );
    begin
      inherited Create;
      Self.Name := Name;
      Self.Position := Position;
      Hits := 0;
      AtBats := 0;
    end;


    var
      Team: TStringList;
      Player, NewPlayer: TPlayer;
      I: Integer;


    function FindPlayer( const Name: string ): TPlayer;
    var
      Idx: Integer;
    begin
      Result := nil;
      if Team.Find( Name, Idx ) then
        Result := TPlayer( Team.Objects[ Idx ] );
    end;


    begin {== Main ==}

      Writeln( 'StringList Dictionary' );
      Writeln( '---------------------' );
      Writeln;

      Team := TStringList.Create;
      try
        NewPlayer := TPlayer.Create( 'Aramis Ramerez', 'Third Base' );
        NewPlayer.Hits := 120;
        NewPlayer.AtBats := 350;

        Team.AddObject( NewPlayer.Name, NewPlayer );

        NewPlayer := TPlayer.Create( 'Derrick Lee', 'First Base' );
        NewPlayer.Hits := 143;
        NewPlayer.AtBats := 329;

        Team.AddObject( NewPlayer.Name, NewPlayer );

        NewPlayer := TPlayer.Create( 'Ryan Theriot', 'Short Stop' );
        NewPlayer.Hits := 87;
        NewPlayer.AtBats := 203;

        Team.AddObject( NewPlayer.Name, NewPlayer );

        Player := FindPlayer( 'Derrick Lee' );
        if Player <> nil then
          Writeln( 'Player Found: ', Player.Name, ', ', Player.Position )
        else
          Writeln( 'Player not found.' );
        Writeln;

        Writeln( 'Active Roster' );
        Writeln( '-------------' );

        for I := 0 to Team.Count - 1 do
          Writeln( TPlayer( Team.Objects[ I ] ).Name, #9,
                   TPlayer( Team.Objects[ I ] ).Position );

        Readln;

      finally
        //!! Need to free the players.
        Team.Free;
      end;

    end.

最佳答案

在 Delphi 2009 中,TStringList 构造函数有一个可选的 bool 参数“OwnsObjects”。如果将其设置为 true,对象将自动释放。

否则您可以执行以下操作:

for i := Team.Count-1 downto 0 do begin
  Team.Objects.Free;
end;
Team.Free;

顺便说一句,不鼓励使用公共(public)字段。您最好使用属性,以便控制对字段的访问权限。您还可以添加 setter 函数来验证输入。

type
  TPlayer = class
  private
    FName     : string;
    FPosition : string;
    FHits     : Integer;
    FAtBats   : Integer;
  public
    constructor Create(const AName, APosition: string );

    property Name: string read FName;
    property Position: string read FPosition;
    property Hits: Integer read FHits write FHits;
    property AtBats: Integer read FAtBats write FAtBats;
 end;

关于delphi - 在delphi中释放多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1019978/

相关文章:

delphi - 带有 FM3 的 Windows XP 中缺少任务栏按钮上下文菜单

delphi - 如何让滚动条在自定义控件中很好地发挥作用?

c++ - 如何在 InitializeObjectAttributes() 中使用 SECURITY_DESCRIPTOR

Delphi "Supports"增加[弱]或[不安全]接口(interface)上的引用计数

delphi - 是否有用于Delphi/Free Pascal的免费JMS客户端?

javascript - 如何使用 Cef4Delphi 从 JavaScript 调用 Delphi 函数

c++ - 我想在 Delphi/WIN32 中使用 Infocardapi.dll 但想要它的头文件

delphi - 使用TTreeview作为菜单

performance - Delphi 中哪种字符串复制方法更快?

delphi - 如何下载ask.fm特定用户墙源代码以及所有问题和答案?