IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[TList] : libération des éléments


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut [TList] : libération des éléments
    Bonjour à tous,

    Je me demande quelle est selon la solution la plus propre pour libérer une TList

    1/on détruit l'objet TList et on libère la mémoire associée.
    2/on libére les éléments de la liste au préalable+ensuite on libére l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for PList:=0 to MyList.count-1 do
      begin
        PMyRecord:=MyList.Items[PList];
        Dispose(PMyRecord);
      end;
    MyList.free;
    Merci de vos lumières

    @

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par défaut
    La Tlist n'est qu'un Tableau de Stockage
    La libération est à la charge du développeur

    si tu libère la liste, tu libère l'objet et son tableau, mais les pointeurs à l'intérieur ne seront pas libéré !
    Dans le cas d'objet, la TObjectList est très utile car elle libère les objets en fonction de l'option OwnsObjects.

    D'ailleurs pourquoi, la Tlist n'aurait pas une propriété OwnsPointers, tout simplement que dans le cas d'un objet, la liste demande à l'objet de se libérer, donc l'objet "sait" ce qu'il doit faire, dans le cas d'un pointeur, dispose ne connait que la longueur occupé par le pointeur et donc agit comme un FreeMem, il ne sait pas libéré les types pointeurs mais juste les types simples (integer, double, ...) et tableau fixe (shortstring, array[0..1] of integer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for PList:=0 to MyList.count-1 do
        Dispose(PMyRecord(MyList.Items[PList]));
    MyList.free;
    MyList := nil;
    Ensuite, le passage par une variable temporaire de pointeur typé ou le cast, est très important pour que le Dispose effectue le Finaliez sur les chaines longues et les tableaux dynamiques, et si c'est un tableau dynamiques de chaines longues, il finalize chaque chaines, ... d'ailleurs si ta structure contient un pointer typé, il sera finalizé, mais si il contient un pointeur non type, il faut que tu fasse explitement de le dipose en castant le pointeur non typé

    voir ce sujet
    http://www.developpez.net/forums/sho...d.php?t=307572
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Citation Envoyé par ShaiLeTroll
    La Tlist n'est qu'un Tableau de Stockage
    La libération est à la charge du développeur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for PList:=0 to MyList.count-1 do
        Dispose(PMyRecord(MyList.Items[PList]));
    MyList.free;
    MyList := nil;
    Ensuite, le passage par une variable temporaire de pointeur typé ou le cast, est très important pour que le Dispose effectue le Finaliez sur les chaines longues et les tableaux dynamiques.
    Bonjour ShaiLeTroll,
    merci de ta réponse
    j'avais un doute sur ce coup là. Merci.

    Autre chose, est-il plus propre
    de faire
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyList.Free;
    MyList:=nil;
    2/

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par défaut
    J'ai été habitué à Delphi 3 à 7, le FreeAndNil c'est récent ! à partir de 6 ? 7 ?
    En fait c'est pareil, le codé généré doit juste être plus long avec FreeAndNil, et je trouve que cette fonction ne fait plus trop objet, j'aime bien le .Free et le := nil (et puis j'en ai bcp dans mes vieux codes), sachant que le second n'est pas systématique, une variable locale n'a pas besoin d'être nullé, alors qu'un membre de classe, c'est recommandé ... je mets le := nil en connaissance de cause, par ce que je sais qu'il sera utile pas pour faire joli !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut

  6. #6
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Citation Envoyé par ShaiLeTroll
    je trouve que cette fonction ne fait plus trop objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      Temp.Free;
    end;
    a mon avis, mieux vaut toujours preferer utiliser les fonctions de la librairie, framework

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tranférer des éléments d'une base
    Par john_wayne dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 21/06/2004, 15h33
  2. [VB.NET] Enregistrement des éléments d'une listBox
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 9
    Dernier message: 18/05/2004, 14h48
  3. couleurs des éléments 3D d'une appli
    Par Eugénie dans le forum MFC
    Réponses: 29
    Dernier message: 12/03/2004, 11h31
  4. [MFC] libération des objets GDI's
    Par Kevgeii dans le forum MFC
    Réponses: 5
    Dernier message: 01/02/2004, 10h37
  5. [TShellListView] Tri des éléments
    Par M.Dlb dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/12/2003, 22h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo