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 :

Fuite mémoire TStringList


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Fuite mémoire TStringList
    Bonjour à toutes et à tous,

    J'ai mis ce paramètre dans mon DPR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ReportMemoryLeaksOnShutDown := true;
    Dans mon prg j'ouvre une form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TFPrincipal.SauvegardeClick(Sender: TObject);
    begin
      With TFSauvegarde.Create(Self) do
      begin
        try
           ShowModal;
        finally
          if Assigned(FSauvegarde) then FreeAndNil(FSauvegarde);
        end;
      end;
    end;
    Voilà où ce situe la fuite mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TFSauvegarde.FormCreate(Sender: TObject);
    Var
      ListeUser :TStringlist;
      i: integer;
    begin
    // initialisation du grid
      StringGridSave.Cells[0,0] := 'Nom Ordinateur';
      ListeUser := TStringList.Create;
      Try
        ListeUser := ListeUserConnnectedAccess;
        sBtSave.Enabled := ListeUser.Count = 1;
        sLabel1.Visible := not sBtSave.Enabled;
        for i := 0 to Listeuser.Count - 1 do
          StringGridSave.Cells[0,i+1] := ListeUSer.Strings[i];
      finally
        ListeUser.Free; // <== Fuite mémoire malgré ce paramètre
      end;
     
    end;
    J'ai essayeé avec FastMM4, même problème.

    Message de la fuite mémoire :
    69 - 76 bytes : TStringlist x1


    J'ai essayé .Free d'affectée nil apres ou avant ou même sur le close de la form et rien n'y change.

    J'ai 4 questions :
    - Où je fais mon erreur de libération ?
    - est-ce que cette fuite memoire peut-être grave ?
    - Plus généralement est-ce qu'une fuite mémoire perdure à la fermeture de l'application ?
    - Est-ce qu'une fuite mémorie ce cumul si l'on ouvre plusieur fois cette form ?

    Merci à vous.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 468
    Points : 24 893
    Points
    24 893
    Par défaut
    Normal tu instancies la TStringList deux fois, l'une dans FormCreate et l'autre dans ListeUserConnnectedAccess

    en général, je fais une procédure qui accepte une liste a remplir, cela évite ce genre de confusion, et souvent je fais une fonction qui renvoie un boolean pour indiquer l'echec ou le succes de la fonction (au lieu d'une exception plus verbeuse)
    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 éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Encore pire que l'étrgane...

    Je me suis amuser à déplacer le contenue de la procédure Create dans le show, ce qui donnais le même résultat.

    Alors je remet tout comme c'était initialement. Hé là... hallucinant !!

    N'aillent rien changé du tout a part cette manip de test, je me retrouve maintenant avec cela en fuite mémoire.


    12 - 20 bytes : UniCodeString x 1
    29 - 36 bytes : Unknow * 1
    69 - 76 bytes : TStringlist x 2


    Et j'arrive même pas à revenir à ma simple première erreur...



    Si il y a un grand minitout des fuites mémoire, je suis tout Ouïe...

  4. #4
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Tu dois en allouer deux (ListeUserConnnectedAccess), en n'en libérer qu'une seule

    - est-ce que cette fuite memoire peut-être grave ?
    Tout depend de ta notion de "grave". Mais une fuite de mémoire dans un programme ce n'est jamais bon!

    - Plus généralement est-ce qu'une fuite mémoire perdure à la fermeture de l'application ?
    Oui, et jusqu'à l'extinction du PC

    - Est-ce qu'une fuite mémorie ce cumul si l'on ouvre plusieur fois cette form ?
    Si tu créé ta Form à chaque fois: la réponse est oui
    Si tu crée ta Form une seule fois et tu te contente de l'afficher: non
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Normal tu instancies la TStringList deux fois, l'une dans FormCreate et l'autre dans ListeUserConnnectedAccess

    en général, je fais une procédure qui accepte une liste a remplir, cela évite ce genre de confusion, et souvent je fais une fonction qui renvoie un boolean pour indiquer l'echec ou le succes de la fonction (au lieu d'une exception plus verbeuse)
    , parfait cela m'élimine la fuite mémoire d'un stringlist, mais apres ma manip maintenant les autres erreurs sont toujorus là !!

    C'est quand même étrange non ?

    [EDIT]
    Merci Sat83, pour tes explications. Et que penses-tu de la suite ?

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part le code ci dessous me choque et je me suis permis de faire un test simple avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TFPrincipal.SauvegardeClick(Sender: TObject);
    begin
      With TFSauvegarde.Create(Self) do
      begin
        try
           ShowModal;
        finally
          if Assigned(FSauvegarde) then 
            FreeAndNil(FSauvegarde);
        end;
      end;
    end;
    FSauvegarde est en création auto au démarrage de l'application

    1er fois, ça passe bien sur le freeandnil
    2em fois, ça ne passe pas dans le freeandnil donc pas de libération de la form

    A mon avis le problème est surtout là que dans la TStringList
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @Rayek

    Tu es sur pour les forms ???? je les créées comme cela partout dans mon soft et je n'ai jamais eu aucun probleme, d'ailleur si j'utilise une autre form (qui se créer de la même manière), jamais j'ai de message de fuites mémoire.

    Le seul endroit où j'ai des fuites mémoires c'est la FSauvegarde.

    Et là on a corrigé une fuite TStringlist tout de même, les autre sont apparu juste a cause de ma manipulation !!!!.

    PS : Si je n'ouvre pas cette form et que j'en ouvre d'autre, je n'ai aucun probleme de fuite mémoire.

    PS2 : Aucune de mes forms sont créés en auto de mon DPR, elles se créées et ce détruisent de cette manière.

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Logiquement (sauf si vraiment je suis a l'ouest), de faire un With TFSauvegarde.Create do, c'est un nouvel objet en mémoire qui n'a rien à voir avec ton Objet FSauvegarde.

    Moi en général quand je créé dynmiquement je fais comme çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TFPrincipal.SauvegardeClick(Sender: TObject);
    begin
      With TFSauvegarde.Create(Self) do
      try
         ShowModal;
      finally
       Release;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @Rayek,

    J'ai lu beaucoup sur cet aspect de form en create, et il apparait que la meilleure méthode est d'utiliser le FreeAndNil. Je suis pas du tout un spécialiste, je me suis inspirer de cela

    http://www.prestwood.com/ASPSuite/KB...asp?qid=101432

    Sinon, pour poursuivre, dans mes recherche, j'ai retirer la gestion de fuite memoire de delphi et choisi d'activer celle de FastMM4, et là !!

    Il me reste un TSTringList x1.

    Je me perds.

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 707
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 707
    Points : 13 167
    Points
    13 167
    Par défaut
    Citation Envoyé par sat83 Voir le message
    - Plus généralement est-ce qu'une fuite mémoire perdure à la fermeture de l'application ?
    Oui, et jusqu'à l'extinction du PC
    Plus sous Seven

    Sinon comme dit Rayek: à moi que FSauvegarde soit assigné dans l'événement OnCreate de TFSauvegarde, son état sera indéterminé et tu vas te retrouver avec des memory leak sporadiques (une fois ça marche, une fois ça marche pas) .

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Si dans ListeUserConnnectedAccess tu créés dynamiquement le TStringList en retour il te faut supprimer celui avant le try.

    Car en fait avec le Premier create, tu créés en mémoire une premiere zone de liste (que je vais nommer liste1), si tu créés aussi dans ta fonction une liste tu va créer une nouvelle zone de mémoire avec une liste différente ( que j'appelle Liste2) et quand tu l'assignes à ta liste (qui a pour le moment un pointeur vers liste1) alors tu vas assigner dans ta liste la zone de mémoire de Liste2.
    Et la c'est la fuite de mémoire car tu ne libèrera jamais la zone de mémoire de Liste1

    J'espère pas avoir dit trop de connerie

    PS: sinon pour les form, moi on m'a toujours dit d'utiliser Release
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon je me résigne à penser que vous avez forcément raison.
    Je vais remplacer tous mes

    if Assigned(Form) then FreeAndNil(Form);
    part un simple release.


    Mais, malgrés cela, mes fuites mémoire sont toujours présente.

    Je fais encore quelque recherche et je reviens mettre des précisions.

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Si dans ListeUserConnnectedAccess tu créés dynamiquement le TStringList en retour il te faut supprimer celui avant le try.

    Car en fait avec le Premier create, tu créés en mémoire une premiere zone de liste (que je vais nommer liste1), si tu créés aussi dans ta fonction une liste tu va créer une nouvelle zone de mémoire avec une liste différente ( que j'appelle Liste2) et quand tu l'assignes à ta liste (qui a pour le moment un pointeur vers liste1) alors tu vas assigner dans ta liste la zone de mémoire de Liste2.
    Et la c'est la fuite de mémoire car tu ne libèrera jamais la zone de mémoire de Liste1

    J'espère pas avoir dit trop de connerie
    Je pense que tu à tout a fait raison, je me suis amusé à mettre un Result.Free (je sais cela parait bizard) mais juste pour voir,et là plus aucune fuite...
    Mais comment on fait pour faire un free sur une function qui retourne un TStringlist ?

  14. #14
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Pour être plus précis voilà la procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function ListeUserConnnectedAccess: TStringList;
    Const
      SchemaID = '{947bb102-5d43-11d1-bdbf-00c04fb92675}';
    Var
      Cnx       : TADOConnection;
      Tbl1      : TADOTable;
    //  Qry1      : TADOQuery;
    //  n         : integer;
    begin
      Cnx  := TADOConnection.Create(nil);
      Tbl1 := TADOTable.Create(nil);
      Tbl1.Connection := Cnx;
      Result := TStringList.Create;
      Result.Sorted := true;
      Result.Duplicates := dupIgnore;
      try
        try
          with Cnx do
          Begin
            Provider := 'Microsoft.Jet.OLEDB.4.0';
            ConnectionString := 'Data Source=' + BaseInterne + ';Persist Security Info=False';
            LoginPrompt := False;
            Mode  := cmReadWrite;
            OpenSchema(siProviderSpecific,EmptyParam,SchemaID,TADODataSet(Tbl1));
          end;
         // On remplie la table UserConnect
          with Tbl1 do
          Begin
            first;
            while not eof do
            begin
              if Fields.Fields[2].AsBoolean then
              begin
                Result.Add(
                Fields.Fields[0].AsString
                );
              end;
              next;
            end;
          end;
        except
          result := nil;
        end;
      finally
        if Assigned(Tbl1) then FreeAndNil(Tbl1);
        if Assigned(Cnx) then FreeAndnil(Cnx);
      end;
    end;

  15. #15
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Je pense que tu à tout a fait raison, je me suis amusé à mettre un Result.Free (je sais cela parait bizard) mais juste pour voir,et là plus aucune fuite...
    Mais comment on fait pour faire un free sur une function qui retourne un TStringlist ?
    comme çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Var
      ListeUser :TStringlist;
      i: integer;
    begin
    // initialisation du grid
       StringGridSave.Cells[0,0] := 'Nom Ordinateur';
       ListeUser := ListeUserConnnectedAccess;
      Try
        sBtSave.Enabled := ListeUser.Count = 1;
        sLabel1.Visible := not sBtSave.Enabled;
        for i := 0 to Listeuser.Count - 1 do
          StringGridSave.Cells[0,i+1] := ListeUSer.Strings[i];
      finally
        ListeUser.Free;
      end;
     
    end;
    en fait la tu travailles avec des objets et non pas avec des variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    var
      A, B : integer;
      lstA,lstB : TStringList;
    begin
      a = 1;
      b := a;
      b := b + 1;
      // a = 1 et b = 2;
     
      lst1 := TstringList.Create;
      try
        lst1.add('Toto');
        lst2 := Lst1;
        lst2.Add('Titi');
        // Là, lst1 et lst2 ont tout les deux Toto et Titi
     
      finally
        lst1.free; 
        List2.free;// si je libère List2 j'aurais une violation d'accès car elle pointe sur List1 qui a déjà été libérée
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  16. #16
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @Rayek

    Je suis désolé mais j'ai pas compris comment tu fais ?, je vois pas où tu libère le result de la function qui retourne un StringList ?



    PS : j'ai mis ma function ListeUserConnnectedAccess (juste avant ton topic)

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 468
    Points : 24 893
    Points
    24 893
    Par défaut
    c'est limite grave !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ListeUser := ListeUserConnnectedAccess;
      Try
          ...
      finally
        ListeUser.Free; 
      end;
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Var
      ListeUser :TStringlist;
    begin
      ListeUser := TStringList.Create;
      Try
        if ListeUserConnnectedAccess(ListeUser) then
        begin
          ...
        end;
      finally
        ListeUser.Free;
      end; 
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    function ListeUserConnnectedAccess(ListeUser: TStringList): Boolean; // Result à False si Erreur
    ...
    begin
      ..
      ListeUser.Clear();
      ListeUser.Sorted := true;
      ListeUser.Duplicates := dupIgnore;
      ...
            while not eof do
            begin
              if Fields.Fields[2].AsBoolean then
                ListeUser.Add(Fields.Fields[0].AsString);
     
              next;
            end;
    ...
    end;
    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

  18. #18
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    c'est limite grave !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ListeUser := ListeUserConnnectedAccess;
      Try
          ...
      finally
        ListeUser.Free; 
      end;
    Mais je l'ai fais ça, j'ai bien compris que ListeUser := ListerUserConnectedAccess; suffisait et que faire ListUser.free, libère aussi celui de la function,

    Mais j'ai toujours une fuite mémoire de TStringlist !!!

  19. #19
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 468
    Points : 24 893
    Points
    24 893
    Par défaut
    Attention au Except qui renvoi nil, dans ce cas tu ne libères pas la TStringList !
    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

  20. #20
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    +1 pour le Result := nil.

    en fait si tu envoi nil tu vas avoir une violation d'accès dès que tu vas aller dans la boucle for de ta liste.
    En fait, il serait mieux que tu l'enlèves, au pire tu retourneras une liste avec count = 0 donc le for ne s'exécutera pas

    Sinon pour les fuite de mémoire, je ne sais plus qu'elle version de delphi (je crois que c'est dephi 5) si tu ne mets pas les patch de borland, les composants ADO ont une fuite de mémoire, autant ton problème viens de là.

    Pour ma part, pour tester les fuite de mémoire, j'ouvre une fois ce que je veux tester, puis je ferme, je regarde dans le gestionnaire des taches la taille de mon exe, puis après jouvre et ferme 10-15 fois ce que je veux tester, si la taille revient toujours à + ou - quelques kilos de ce que j'ai noté comme taille, c'est qu'il n'y a pas de fuite de mémoire.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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