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 :

Fuite memoire sur fonction qui retourne TstringList (explode)


Sujet :

Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut Fuite memoire sur fonction qui retourne TstringList (explode)
    Bonjour

    J ai une fuite memoire dans mon appli detectee par reportmemoryleaksonshutdown := true; dans mon formcreate.

    Apres analyse j ai detecté sa provenance mais je ne sais pas comment y remedier.

    C est la fonction explode suivante qui provoque cela :

    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
    function Explode(ch: string; sep: string): TStringList;
    var
      p: integer;
    begin
      p := pos(sep, ch);
      Explode := TStringList.Create;
      while p > 0 do
      begin
        Explode.Add(copy(ch, 1, p - 1));
        if p <= length(ch) then
          ch := copy(ch, p + length(sep), length(ch));
        p := pos(sep, ch);
      end;
      if length(ch) > 0 then
        Explode.Add(ch);
    end;
    de ce que je comprends la List est retournée apres avoir été crée. Mais elle n est pas detruite...

    J apelle la fonction ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    list_explode := TStringlist.Create;
    list_explode := explode(Stg, ';');
         ...traitement...
    list_explode.destroy;
    Tous vos conseils sont les bienvenus car j apelle cette fonction dans une imbrication de boucles, soit 1156 fois...

    merci de votre aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    j ai solutionné le pb en procedant ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      list: TStringList;
      I: Integer;
    begin
      list := TStringList.Create();
      list.Delimiter :=';';
      list.DelimitedText := 'string1;string2;string3';
      for I := 0 to list.Count - 1 do
        Memo1.Lines.Add(list[I]);
      list.Destroy;
    end;
    mais j aimerais tout de même savoir s il y a une solution à ce type de pb

    merci

  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
    Bjr

    On ne doit jamais appeler la méthode destroy directement soit tu fait :

    - <TaList>.free;
    ou
    - If Assigned(<TaList>) then FreeAndNil(<TaList>);

    bye.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 393
    Points : 637
    Points
    637
    Par défaut
    la fuite est logique, ta liste est créée 2 fois ...

    soit tu fais comme cela


    // list_explode := TStringlist.Create; // inutile
    l
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ist_explode := explode(Stg, ';');
         ...traitement...
    list_explode.destroy;
    soit tu modifies ta fonction explode pour lui passer en paramètre ta liste, et donc tu ne la crée pas dans explode !

  5. #5
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    La réponse idéale étant celle qui unifiera les réponses de BuzzL'eclai et de exoseven

  6. #6
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    J'utilise tous le temps cette méthode

    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
    var
      list: TStringList;
      I: Integer;
    begin
      list := nil;
     
      try
        list := TStringList.Create();
        list.Delimiter :=';';
        list.DelimitedText := 'string1;string2;string3';
        for I := 0 to list.Count - 1 do
          Memo1.Lines.Add(list[I]);
      finally
        FreeAndNil(list);
      end;
    end;

  7. #7
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    sinon tu utilise directement la fonction existante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      sl: TStringList;
    begin
      sl := TStringList.Create;
      ExtractStrings([';'], [], PChar(Stg), sl); //necessite le uses "Classes"
    Attention, cette fonction supprime les chaines vides. Si stg="a;b;;d", elle te retournera 3 element : a, b, et d.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    Merci pour vos réponses j ai supprimé mon Tstringlist.create.

    Je vais reprendre mon code pour extraire le type de donnée et sa position etant donné que je connais la structure de ma chaine.
    J y perdrais surement en temps d execution mais y gagnerais en clarté et 'robustesse'.

    merci à tous

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

Discussions similaires

  1. [2008R2] Fonction qui retourne une table sur Excel
    Par VITALTH dans le forum Développement
    Réponses: 0
    Dernier message: 06/02/2015, 10h34
  2. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  3. Réponses: 2
    Dernier message: 07/08/2008, 21h21
  4. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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