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 :

Problème memory leak


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Problème memory leak
    Bonjour,

    j'ai des problèmes de memory leak après activation de sharemem.

    Au début, le code qui pose problème était le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function TCompoCustom.TBitmapToTGPBitmap(DBitmap:TBitmap):TGPBitmap;
    var
      stream:TMemoryStream;
    begin
     
      stream := TMemoryStream.Create;
      DBitmap.SaveToStream(stream);
      Result := TGPBitmap.Create(TStreamAdapter.Create(stream));
     
    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
    TCompoCustom.paint;
    var
      OGraphics:TGPGraphics;
      tampon:TBitmap;
     
    begin
    tampon:=nil;
    ..........
    tampon:=TBItmap.create();
    OGraphics:=TGPGraphics.Create(Canvas.Handle);
    OGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
    OGraphics.SetCompositingQuality(QualityModeHigh);
    OGraphics.DrawImage(TBitmapToTGPBitmap(tampon),0,0);
     
    try if tampon<>nil then FreeAndNil(tampon); except end;
    try FreeAndNil(OGraphics); except end;
    Ce code générait des memory leak, je l'ai donc modifié comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function TCompoCustom.TBitmapToTGPBitmap(DBitmap:TBitmap;stream:TMemoryStream;StreamAdapter:TStreamAdapter):TGPBitmap;
     
    begin
     
      stream := TMemoryStream.Create;
      DBitmap.SaveToStream(stream);
      StreamAdapter:=TStreamAdapter.Create(stream)
      Result := TGPBitmap.Create(StreamAdapter);
     
    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
    19
    TCompoCustom.paint;
    var
      OGraphics:TGPGraphics;
      stream:TMemoryStream;
      StreamAdapter:TStreamAdapter
      tampon:TBitmap;
    begin
    tampon:=nil;
    ..........
    tampon:=TBitmap.create();
    OGraphics:=TGPGraphics.Create(Canvas.Handle);
    OGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
    OGraphics.SetCompositingQuality(QualityModeHigh);
    OGraphics.DrawImage(TBitmapToTGPBitmap(tampon,stream,StreamAdapter),0,0);
     
    try if tampon<>nil then FreeAndNil(tampon); except end;
    try FreeAndNil(stream); except end;
    try FreeAndNil(StreamAdapter); except end;
    try FreeAndNil(OGraphics); except end;
    Et la toujours un problème de leak....

    Je ne comprend pas, car même si ca parait un peu bancal de déclarer des var dans un pâint pour les allouer dynamiquement dans une fonction, les variables sont bien libérées....

    Quelqu'un pourrait t'il me mettre sur la voie svp, il semblerait que quelque chose m'échappe dans la gestion de la mémoire
    Merci

  2. #2
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    L'objet retourné par TBitmapToTGPBitmap n'est jamais liberé.

  3. #3
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut
    oui tu as raison, j'ai oublié de préciser que j'avais aussi testé ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tampon2:=TBitmapToTGPBitmap(tampon,stream,StreamAdapter);
    ...........
    FreeAndNil(tampon2);
    ca me sort une erreur également, qui viendrait de la libération apparement...

  4. #4
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Dans ton code, il manque la déclaration et la création de tampon, mais je ne pense pas que ça vienne de là.

    Par contre les try except sur les destructeurs sont inutiles. Si tu as des exceptions dessus, c'est qu'il y a un autre problème.

    Par contre au niveau logique de programmation, je ferais plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function TCompoCustom.TBitmapToTGPBitmap(DBitmap:TBitmap):TGPBitmap;  
    var
      StreamAdapter:TStreamAdapter;
      Stream:TMemoryStream;
    begin 
      Stream := TMemoryStream.Create;
      DBitmap.SaveToStream(Stream);
      StreamAdapter:=TStreamAdapter.Create(Stream)
      Result := TGPBitmap.Create(StreamAdapter);
      StreamAdapter.Free;
      Stream.Free;
    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
     
    TCompoCustom.paint;
    var
      OGraphics:TGPGraphics;
    GPBitmap:TGPBitmap;
    begin
    tampon:=nil;
    ..........
    OGraphics:=TGPGraphics.Create(Canvas.Handle);
    OGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
    OGraphics.SetCompositingQuality(QualityModeHigh);
    GPBitmap := TBitmapToTGPBitmap(tampon);
    OGraphics.DrawImage(GPBitmap,0,0);
    GPBitmap.Free;
     
    if Assigned(nil) then FreeAndNil(tampon);
    FreeAndNil(OGraphics);

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Par défaut
    Salut,
    Moi ce qui me dérange c'est Tampon := nil...
    Quand tu fais un FreeAndNil(Tampon)...ben en fait il se passe rien, pas de handle pour le FreeAndNil...
    C'est peut-être ceci que tu devrais utiliser Tampon.FreeImage;
    @+

  6. #6
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut
    Dans ton code, il manque la déclaration et la création de tampon, mais je ne pense pas que ça vienne de là.
    Lol effectivement le tampon est bien crée dans le paint, c'était un oubli de ma part dans le topic.

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

Discussions similaires

  1. Problème de memory leaks
    Par FourierFan dans le forum wxWidgets
    Réponses: 2
    Dernier message: 19/06/2008, 11h17
  2. Problème de memory leak
    Par Tiberizz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/05/2007, 17h11
  3. Memory leak en C/C++
    Par Roswell dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 07/07/2004, 19h41
  4. [MFC] A la chasse au memory leak
    Par Yabo dans le forum MFC
    Réponses: 17
    Dernier message: 27/06/2004, 17h35
  5. Réponses: 7
    Dernier message: 26/02/2004, 09h32

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