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

Lazarus Pascal Discussion :

Fuite mémoire dans l'unité XMLRead [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre averti
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Par défaut Fuite mémoire dans l'unité XMLRead
    Bonjour,

    Heaptrc signale une fuite mémoire lors de l'utilisation de la fonction ReadXMLFile de l'unité XMLRead (FPC 2.6.4).
    Voici le code:
    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
    procedure ReadXMLFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String);
    var
      Reader: TXMLTextReader;
      Src: TXMLCharSource;
    begin
      ADoc := nil;
      Reader := TXMLTextReader.Create;
      try
        Src := TXMLStreamInputSource.Create(f, False);
        Src.SystemID := ABaseURI;
        Reader.ProcessXML(Src);
      finally
        ADoc := TXMLDocument(Reader.doc);
        Reader.Free;
      end;
    end;
    A la lecture du code, il semble qu'il manque un Src.Free; mais si je l'ajoute, j'obtiens une violation d'accès.
    Je sèche...

  2. #2
    Membre expérimenté

    Homme Profil pro
    Diverses
    Inscrit en
    Février 2014
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Diverses

    Informations forums :
    Inscription : Février 2014
    Messages : 122
    Par défaut
    J'ai un programme en court de dev qui utilise cette unité et je n'ai pas de fuite mémoire. Je suppose que Lazarus lui même doit dépendre pas mal de cette unité pour lire ses fichiers de config donc un bug me paraît peu probable.

    Aurais tu un exemple complet qui provoque cette fuite ?

  3. #3
    Membre averti
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Par défaut
    Citation Envoyé par yamer Voir le message
    J'ai un programme en court de dev qui utilise cette unité et je n'ai pas de fuite mémoire. Je suppose que Lazarus lui même doit dépendre pas mal de cette unité pour lire ses fichiers de config donc un bug me paraît peu probable.

    Aurais tu un exemple complet qui provoque cette fuite ?
    J'ai constitué un projet de test (cf. fichier zip joint).
    Il suffit de cliquer sur le bouton 'Test' et quitter l'application pour voir :

    Nom : 2015-12-22_173645.png
Affichages : 222
Taille : 18,2 Ko

    Le code est simple :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      XML: TXMLDocument; // use DOM unit
    begin
      XML:= TXMLDocument.Create;
      try
        ReadXML(XML, Memo1.Text);
      finally
        XML.Free;
      end;
    end;
     
     
    procedure ReadXML(out XMLDoc: TXMLDocument; const Text: String);
    var
      Stream: TStringStream;
    begin
      if Length(Text) >  0 then
        begin
          Stream:= TStringStream.Create(Text);
          try
            ReadXMLFile(XMLDoc, Stream, 'stream:');
          finally
            Stream.Free;
          end;
        end;
    end;
    Fichiers attachés Fichiers attachés

  4. #4
    Membre chevronné

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Par défaut
    Sauf erreur de ma part...

    Le message indiquant la fuite memoire est : 'line 41 of ujust4test.pas'. Et la ligne 41 de votre code correspond à : XML:= TXMLDocument.Create;

    Or, manifestement cet objet est créé lors de l'appel à la fonction ReadXML: cf. ici par exemple (pour une autre version de cette fonction) http://wiki.freepascal.org/XML_Tutor...ng_a_text_node .

    Conclusion: commentez/supprimez la ligne 41, et il ne devrait alors plus y avoir de fuite mémoire dans votre programme de test.

  5. #5
    Membre averti
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Par défaut
    Citation Envoyé par FChrisF Voir le message
    Sauf erreur de ma part...

    Le message indiquant la fuite memoire est : 'line 41 of ujust4test.pas'. Et la ligne 41 de votre code correspond à : XML:= TXMLDocument.Create;

    Hors, manifestement cet objet est créé lors de l'appel à la fonction ReadXML: cf. ici par exemple (pour une autre version de cette fonction) http://wiki.freepascal.org/XML_Tutor...ng_a_text_node .

    Conclusion: commentez/supprimez la ligne 41, et il ne devrait alors plus y avoir de fuite mémoire dans votre programme de test.
    Effectivement, cela venait bien de cette ligne et non de la fonction ReadXML(). Dans ma recherche du problème j'avais commenté l'appel à ReadML() et la fuite ne se produisait plus, d’où mon erreur dans la mise en cause de cette fonction.
    Un grand merci (une fois de plus) pour votre aide.

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

Discussions similaires

  1. [OCI] Fuite mémoire dans libclntsh
    Par Adil BE dans le forum Interfaces de programmation
    Réponses: 8
    Dernier message: 08/09/2009, 14h52
  2. Fuite mémoire dans une appli dev avec vc++6
    Par devconf77 dans le forum Windows
    Réponses: 1
    Dernier message: 26/08/2008, 08h58
  3. fuite mémoire dans le JSP editor
    Par ChristopheH dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 18/04/2008, 17h20
  4. fuite mémoire dans un processus
    Par ryadh.naouar dans le forum POSIX
    Réponses: 4
    Dernier message: 09/05/2007, 11h53
  5. Réponses: 19
    Dernier message: 04/10/2006, 16h53

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