Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do I have to allocate and free records when using TList<T> in Delphi?

The question more or less says it all. Given the following record structure:

type
    TPerson = record
        Name: string;
        Age: Integer;
    end;
    PPerson = ^TPerson;
    TPersonList = TList<TPerson>;

Is the following code valid?

procedure ReadPeople(DataSet: TDataSet; PersonList: TPersonList);
begin
    PersonList.Count := DataSet.RecordCount;
    if DataSet.RecordCount = 0 then
        Exit;

    DataSet.First;
    while not DataSet.Eof do begin
        PersonList[DataSet.RecNo].Name := DataSet.FieldByName('Name').AsString;
        PersonList[DataSet.RecNo].Age := DataSet.FieldByName('Age').AsInteger;
        DataSet.Next;
    end;
end;

Do I have to use GetMem/FreeMem to allocate and free records an instance of TPersonList, or am I free to directly access the TPersonList entries directly? My gut says that the code should be valid, though I'm not sure if there's any wrinkles related to record initialization or finalization.

like image 660
afrazier Avatar asked Apr 24 '10 01:04

afrazier


2 Answers

Your code's fine. When you use Tlist<T> with records, it treats them as value types, to be copied around. There's no need to allocate pointers for them.

like image 200
Mason Wheeler Avatar answered Oct 11 '22 18:10

Mason Wheeler


The question is: Why do you declare PPerson? Make sure that you do not accidentally try to deallocate the memory of a TRecord from your list to which you were pointing in a PPerson variable.

like image 44
dummzeuch Avatar answered Oct 11 '22 16:10

dummzeuch