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

Langage Delphi Discussion :

Comment libérer la mémoire d'un TList ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut Comment libérer la mémoire d'un TList ?
    Afin de libérer correctement la memoire de mon Tlist qui contient un record (X,Y), je libère à l'aide de la fonction dispose un à un les pointeurs de 0 à count-1, comme il est indiqué dans l'aide. Puis je veux libérer ma Tlist. Cependant lorsque j'écris liste.free, j'ai une erreur "Opération pointeur incorrecte" qui apparait. D'ou peut venir cette erreurl, comment la contourner?

    Merci à vous.

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Tu as une erreur sur la ligne du free ou sur une autre ligne ?

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    As-tu mis tes pointeurs à nil juste après le dispose ?

  4. #4
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut
    Non je n'ai pas d'erreur à la compilation. Par contre je n'ai pas mis mes pointeurs à nil. Quel en est l'intèret, puisque le dispose est censé libérer la mémoire?

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Salut

    Ce n'est pas normal, montre le code s'il n'est pas trop difficile à extraire.


    cdlt

    e-ric

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Tchaill39
    Non je n'ai pas d'erreur à la compilation. Par contre je n'ai pas mis mes pointeurs à nil. Quel en est l'intèret, puisque le dispose est censé libérer la mémoire?
    Si tu ne te mélange pas les pinceaux pour la libération de tes objets, ça n'a effectivement aucun intéret !

    MAIS :
    1) Si ton pointeur est à nil, tu es sur qu'il a déjà été libéré et qu'il ne pointe donc sur rien, dans le cas contraire tu n'en a aucune certitude : essaies de faire deux dispose d'affilée sur le même pointeur, tu verras ; essaies ce code pour voir (dans une fiche, tu mets un bouton et tu code le clic comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    type
    Str18 =string[18];
    var
    P:^Str18;
    begin
    New(P);
    P^ :='Test...';
    Dispose(P);
    Dispose(P);  //<--déclenchement d'une erreur
    end;
    2) Il est possible que ta violation d'accès vienne de là

    3) en général je fait une petite procedure pour libérer mes pointeurs sans erreurs, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure LiberePointeur(P:pointer);
    begin
      if P<>nil then 
      begin
         dispose(P);
         P:=nil;
      end;
    end;
    sinon, effectivement, l'exemple dans l'aide Delphi donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for B :=0 to(MyList.Count -1)do
     
    begin
    ARecord :=MyList.Items[B];
    Dispose(ARecord);
    end;
    finally
    MyList.Free;
    end;
    Sauf que ce code n'est pas bon si la liste est vide ! (Count=0), à la place avant de parcourir tout les éléments d'une liste il faut toujours s'assurer que la liste contient déjà quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if MyList.Count>0 then
    for B :=0 to(MyList.Count -1)do
     
    begin
    ARecord :=MyList.Items[b];
    if ARecord<>nil then begin
                                     Dispose(ARecord);
                                     ARecord:=nil;
                                  end;
    end;
    finally
    MyList.Free;
    end;
    Enfin, la méthode Free, de TList, appelle la méthode Destroy, qui appelle la méthode Clear, qui appelle la méthode SetCount, qui appelle la méthode Delete, qui appelle la méthode virtuelle Notify en testant pour ce dernier appel si ton pointeur est différent de nil !

  7. #7
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut J'ai trouvé !!!!
    En fait la violation d'accès se manifestait lors du dispose, mais l'erreur était ailleurs. Dans la même procedure j'ai un tableau dynamique auquel j'allouais une valeur hors de ses bornes. Du coup, cela endommageait une partie de la liste, et je ne pouvais plus la désallouer.
    C'est un peu vicieux quand même! Vive les pointeurs.....

    Merci pour votre aide.

    A+

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Citation Envoyé par waskol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure LiberePointeur(P:pointer);
    begin
      if P<>nil then 
      begin
         dispose(P);
         P:=nil;
      end;
    end;
    Il serait plus juste d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure LiberePointeur(var P:pointer);
    begin
      if P<>nil then 
      begin
         dispose(P);
         P:=nil;
      end;
    end;
    Sinon l'affectation P:=Nil n'a pas d'impact dans l'appelant. C'est juste une petite remarque.

    cdlt

    e-ric[/b]

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Tout à fait (j'ai tapé le code un peu trop vite là... )

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

Discussions similaires

  1. Table de hashage: Comment libérer la mémoire
    Par jujudelyon dans le forum Débuter
    Réponses: 3
    Dernier message: 05/02/2014, 20h27
  2. Comment libérer la mémoire allouée au OleVariant ?
    Par LeBigornot dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 10/01/2010, 09h11
  3. Comment libérer la mémoire alloué a un objet ?
    Par techz dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 26/08/2009, 08h44
  4. Comment libérer la mémoire tampon
    Par xmeszeus dans le forum Fortran
    Réponses: 4
    Dernier message: 20/11/2008, 09h29
  5. Libérer la mémoire d'une TList d'une TList d'une TList
    Par QuickSave dans le forum Langage
    Réponses: 0
    Dernier message: 21/08/2007, 14h11

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