Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用TList时是否必须分配和释放记录<;T>;在德尔菲?_Delphi_Generics_Record - Fatal编程技术网

Delphi 使用TList时是否必须分配和释放记录<;T>;在德尔菲?

Delphi 使用TList时是否必须分配和释放记录<;T>;在德尔菲?,delphi,generics,record,Delphi,Generics,Record,这个问题或多或少说明了一切。鉴于以下记录结构: type TPerson = record Name: string; Age: Integer; end; PPerson = ^TPerson; TPersonList = TList<TPerson>; 我必须使用GetMem/FreeMem来分配和释放TPersonList的实例记录,还是可以直接访问TPersonList条目?我的直觉告诉我代码应该是有效的,尽管

这个问题或多或少说明了一切。鉴于以下记录结构:

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

我必须使用
GetMem
/
FreeMem
来分配和释放
TPersonList
的实例记录,还是可以直接访问
TPersonList
条目?我的直觉告诉我代码应该是有效的,尽管我不确定是否有任何与记录初始化或终结相关的问题。

您的代码没有问题。当您对记录使用
Tlist
时,它将它们视为要复制的值类型。没有必要为它们分配指针。

问题是:为什么要声明Perperson?请确保您没有意外地尝试从列表中释放您在Perpson变量中指向的TRecord的内存。

这是一个坏习惯,比任何其他习惯都重要。太棒了。非常感谢。现在,我必须决定是否将记录或类用于我的业务对象更有意义。
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;