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

C# Discussion :

Fuite mémoire? Mais où?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 101
    Par défaut Fuite mémoire? Mais où?
    Bonjour,

    Voila je travail avec des objets Bitmap et Graphic dans mon projet.
    J'ai réduit mon code pour obtenir ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Graphics g = Graphics.FromHwnd(this.Handle);
    Bitmap b = new Bitmap(1024,768,g);
     
    pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap());
     
    b.Dispose();
    b = null;
     
    g.Dispose();
    g = null;
    Alors ça ne sert à rien comme ça mais c'est juste pour vous présentez mon problème.

    Ce code est dans un timer, de 200ms (le temps n'a aucune importance), le problème c'est que dans le gestionnaire de tache, je constate que mon programme monte facilement à 200mo de mémoire, et le nombre d'objet GDI augmente sans cesse.

    Je voudrais savoir ce que j'ai oublié? pourquoi je libère bien les objets

    J'ai un doute sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap());
    Mais comment je peux faire?

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    je connais pas le fonctionnemnt exact du GC !

    Mais je sais qu il existe de soft du genre : .NET Memory Profiler 3.1. (full function trial 14 jours)

    a+

  3. #3
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Bonjour,

    Je vois pas trop ce que tu veux faire. A quoi sert l'objet Graphics ?

  4. #4
    Membre éprouvé Avatar de Nikoui
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Bonjour, et en stockant le résultat de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IntPtr hBitmap = b.GetHbitmap();
    puis en appelant ensuite avant de quitter un petit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DeleteObject(hBitmap );
    c'est mieux?

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Si mes souvenirs sont bon dispose n'est pas toujours implémenté sur les objets.
    Je crois qu'il faut peut être le surcharger dans ton cas.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Dispose est implanté sur tous les objets du famework ayant trait à manipuler des ressources non managées.

    Comment microsoft pourrait espéré que les développeur le fasse, s'ils ne le faisaient pas eux même

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Je confonds peut être avec JAV, mais j'ai un vague souvenir que l'un des deux langages n'implémentent pas toujours le dispose, il propose toujours la méthode mais des fois elle est vide.

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Tuizi il faut prendre la solution de Nikoui il faut appeler DeleteObject
    Voilà un exemple du MSDN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using System.Runtime.InteropServices;
    ...
    [DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr hObject);
    ...
    Bitmap bm = new Bitmap("Picture.jpg");
    IntPtr hBitmap = bm.GetHbitmap(Color.Blue);
    // Do something with hBitmap.
    DeleteObject(hBitmap);
    Une HBitmap c'est un objet GDI pas GDI+ donc .NET va déléguer la création d'un objet graphique au système...
    les objets GDI ne sont pas gérés obligatoirement par .NET mais plutot par le système
    Image.FromHbitmap MethodSee Also
    Image Class | Image Members | System.Drawing Namespace | Managed Extensions for C++ Programming
    Language
    C#
    C++
    JScript
    Visual Basic

    Creates a Bitmap object from a Windows handle.

    Overload List
    Creates a Bitmap object from a handle to a GDI bitmap.

Discussions similaires

  1. Fuites massive de mémoire! Mais pourquoi? :/
    Par Spidyy dans le forum Débuter
    Réponses: 5
    Dernier message: 15/06/2009, 22h27
  2. [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
  3. [Toujours fuite de mémoire, mais repéré]
    Par Gonath dans le forum C++
    Réponses: 4
    Dernier message: 06/03/2006, 00h01
  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