【发布时间】:2009-06-19 20:50:55
【问题描述】:
下面,我插入了 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.
【问题讨论】:
-
其他说明:构造函数中不需要Self.Name等。为什么要使用控制台应用程序?为什么不对玩家列表使用单独的类?
-
如果这是整个应用程序,您不需要释放任何内存,因为您已经完成了应用程序
-
@BlackTigerX:这看起来像一个简单的插图。对于这种情况,您是对的,但他尝试使用的实际代码可能要复杂得多。
-
Gamecat, "Self.Name" is 在构造函数中需要。否则,对象的名称字段将不会被设置。
-
您有演示文稿的链接吗?如果 Konopka 的代码中有“finally”部分中的注释,那么我想知道遗漏是否是演示的重点。
标签: delphi