← →edge
(2004-10-22 16:12)
[0]
procedure TForm1.FormButton1Click(Sender: TObject);
type
PMyList = ^AList;
AList = record
I: Integer;
C: Char;
end;
var
MyList: TList;
ARecord: PMyList;
B: Byte;
Y: Word;
begin
MyList := TList.Create;
try
New(ARecord);
ARecord^.I := 100;
ARecord^.C := "Z";
MyList.Add(ARecord);
New(ARecord);
ARecord^.I := 200;
ARecord^.C := "X";
MyList.Add(ARecord);
for B := 0 to (MyList.Count - 1) do
begin
ARecord := MyList.Items[B];
Dispose(ARecord);
end;
finally
MyList.Free;
end;
end;
Пример взят из хелпа. Обязательно ли писать
for B := 0 to (MyList.Count - 1) do
begin
ARecord := MyList.Items[B];
Dispose(ARecord);
end;
ведь Free освобождает память и уничтожает указатели. Если обязательно, то можно вместо цикла написать MyList.Clear?


← →begin...end ©
(2004-10-22 16:16)
[1]
> Обязательно ли писать
Если хочешь, чтобы память освободилась, - обязательно.
> ведь Free освобождает память и уничтожает указатели
Память, занимаемая указателями, освобождается, в отличие от тех участков памяти, на которые эти указатели указывают.


← →Digitman ©
(2004-10-22 16:20)
[2]
> Free освобождает память и уничтожает указатели
указатели - да, уничтожает.
но TList не делает никаких предположений на счет того, ЧТО конкретно ассоциировано под данным указателем ... ты вполне мог создать объект и записать его адрес в элемент списка, а мог выполнить и Getmem() и New() .. для каждого случая класс TList должен был бы знать , какую из "разрушающих" п/пргограмм он должен был бы вызывать в каждом из конкретных случаев ... НГО ! класс TList хранит ТОЛЬКО адреса, и знать не5 знает, на ЧТО КОНКРЕТНО эти адреса указывают ... поэтому только ты сам волен определять, какую из "разрушающих" п/программ следует вызывать в том или ином конкретном случае

