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 un objet TStream ?


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut Comment libérer un objet TStream ?
    Bonjour,

    J'ai un problème de libération de mémoire avec un TStream.

    J'ai simplifié le code pour ici:
    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
     
    Var
      zip : TZipFile;
      xml : TMyXML;
      Stream: TStream;
      id : integer;
      header : TZipHeader;
    begin
        zip := TZipFile.Create;
        zip.Open('test.zip',zmRead);
        id := zip.indexof('config.xml');
        if (id>-1) then
        Begin
           Stream := TStream.Create;
           zip.Read(id,Stream,Header);
           Stream.Free;
        End;
        zip.close;
        zip.free;
      End;
    end;
    J'ai activé la vérification de fuites mémoires à la sortie de l'application et j'ai le message suivant:

    An unexpected memory leak has occured.
    The unexpected small block leaks are:
    1-12 bytes: Tstream x 76


    Comment libérer l'espace occupé lors de la lecture du Zip.Read ?
    Car à priori le problème vient bien de là ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 452
    Points : 33 604
    Points
    33 604
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    peut-être en commançant par le mettre dans un bloc try.. finally .. end

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         Stream := TStream.Create;
         try
           zip.Read(id,Stream,Header);
         finally  
           Stream.Free;
         end;
    et en utilisant FreeAndNil(Stream) à la place ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut
    Je viens de faire le test, ça ne change rien.

  4. #4
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut
    Bon en fait, zip.Read créé l'objet Stream.
    Si je retire simplement la ligne Stream:= TStream.create, je n'ai plus de message d'erreur.

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    7 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 7 911
    Points : 25 677
    Points
    25 677
    Par défaut
    Citation Envoyé par franckcl Voir le message
    Bon en fait, zip.Read créé l'objet Stream.
    Si je retire simplement la ligne Stream:= TStream.create, je n'ai plus de message d'erreur.
    it's a trap ! et oui, ton objet stream créé était remplacé par celui du ZIP sans le libérer...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. 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, 09h44
  2. Comment libérer proprement un objet COM en dotnet.
    Par sybaris dans le forum C++/CLI
    Réponses: 0
    Dernier message: 15/06/2009, 17h04
  3. Réponses: 4
    Dernier message: 02/09/2008, 21h46
  4. [servlet][bean]comment récupérer l'objet request
    Par otminou dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/09/2004, 15h40
  5. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 18h34

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