2010-04-24 2 views
6

La question plus ou moins dit tout. Compte tenu de la structure d'enregistrement suivante:Dois-je allouer et libérer des enregistrements lors de l'utilisation de TList <T> dans Delphi?

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

Le code suivant est-il valide?

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; 

Dois-je utiliser GetMem/FreeMem pour allouer et gratuit enregistre une instance de TPersonList, ou suis-je libre d'accéder directement aux entrées TPersonList directement? Mon instinct dit que le code devrait être valide, même si je ne suis pas sûr s'il y a des rides liées à l'initialisation ou la finalisation de l'enregistrement.

Répondre

10

Votre code est correct. Lorsque vous utilisez Tlist<T> avec des enregistrements, il les traite comme des types de valeur à copier. Il n'y a pas besoin d'allouer des pointeurs pour eux.

+0

Génial. Je vous remercie! Maintenant, je dois décider si les enregistrements ou les classes auraient plus de sens à utiliser pour mes objets de gestion. – afrazier

1

La question est: Pourquoi déclarez-vous PPerson? Assurez-vous que vous n'essayez pas accidentellement de libérer la mémoire d'un TRecord de votre liste vers laquelle vous étiez pointé dans une variable PPerson.

+0

C'est une mauvaise vieille habitude plus que toute autre chose. – afrazier

Questions connexes