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

Visual C++ Discussion :

Fuite m�moire et d�sapointement


Sujet :

Visual C++

  1. #1
    Membre �m�rite
    Inscrit en
    Mai 2002
    Messages
    673
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par d�faut Fuite m�moire et d�sapointement
    Bonjour.

    J'ai un probl�me de fuite m�moire dans un code sous VC++6.
    J'utilise un controle CWebBrowser, et a chaque fois que la fenetre est rafraichie (apres le rafraichissement pour etre precis) :

    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
     
     
                 lpDispatch = m_browser.GetDocument(); // m_browser est mon CWebBrowser2
    	IHTMLDocument2 *doc2 = NULL;
    	lpDispatch->QueryInterface(IID_IHTMLDocument2,(void**)&doc2);
    	if ( doc2 == 0 )
    		return;
    	IHTMLElement *lpBodyElement; 
    	IHTMLBodyElement *lpBody; 
    	IHTMLTxtRange *lpText; 		
    	doc2->get_body(&lpBodyElement); 
    	if ( lpBodyElement )
    	{
    		lpBodyElement->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody); 
    		if ( lpBody )
    		{
    			lpBody->createTextRange(&lpText); 
    			BSTR bstrText; 
    			lpText->get_htmlText(&bstrText); 
     
                                          // mon traitement
    Et je fini mon traitement avec :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    			lpBody->Release();			
    			//delete(lpBody); 	
    		}
    		//delete(lpBodyElement);
    		lpBodyElement->Release();
    	}
    	doc2->Release();
    Ce qui devrait d�salou� tout ce petit monde.
    Pourtant, a chaque refresh de ma page web dans mon CWebBrowser, mon processus se prend entre 300 et 500k dans la figure... au bout de quelque heures d'utiilisation, mon processus p�se pr�s de 70Mo alors qu'il en pesait 16 au lancement.
    Compte tenu de la taille qu'il prend a chaque refresh, je suis persuad� que c'est le contenu HTML de la page web qui est charg�e en m�moire qui n'est pas d�salou�.

    J'ai donc essay� des free() et des delete(), mais le r�sultat reste le m�me.
    Etant expert en PHP, mais pas du tout en C, j'aurais vraiment besoin qu'on m'explique ce qui ne vas pas...


    J'ai �galement essay� de faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
     // CString i2a(int); // converti un int en Cstring
    	MessageBox(i2a((int)doc2));
    	doc2->Release();
    	free(doc2);
    	MessageBox(i2a((int)doc2));
    Pourtant, les 2 MessageBox m'affichent le m�me r�sultat... docs ne devrait-il pas etre �gale � NULL apres le free ? m�me chose avec delete :/

    Quelqu'un comprend t-il pourquoi �a fait �a.

    Merci d'avance.

    edit : il n'y a bien entendu pas de return dans le code

    edit2 : j'ai coup� mon code trop tot pour voir le delete sur lpText, mais je l'avais test� aussi

  2. #2
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par d�faut
    Bonjour,

    pourquoi n'utilises-tu pas les delete (pourquoi les as-tu mis en commentaire)? Je ne trouve pas de doc sur cette m�thode Release

  3. #3
    Membre �m�rite
    Inscrit en
    Mai 2002
    Messages
    673
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par d�faut
    A vrai dire, j'ai pomp� cette partie du code sur la msdn et des forums.
    Pour le delete, je les ai mis en commantaire car c'est moi qui les avait ajout�, et que cela ne changeait strictement rien.

    Ce sont des delete, mais j'ai egalement essay� de mettre des free() sans plus de r�sultat...

    La combinaison Release + delete ne donne rien non plus...

    Cependant, je me pose toujours la question de savoir si c'est normal que mon pointeur indique toujours la meme adresse apres un delete. Il ne devrait pas passer a NULL ?

  4. #4
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par gloubi
    A vrai dire, j'ai pomp� cette partie du code sur la msdn et des forums.
    Pour le delete, je les ai mis en commantaire car c'est moi qui les avait ajout�, et que cela ne changeait strictement rien.

    Ce sont des delete, mais j'ai egalement essay� de mettre des free() sans plus de r�sultat...

    La combinaison Release + delete ne donne rien non plus...

    Cependant, je me pose toujours la question de savoir si c'est normal que mon pointeur indique toujours la meme adresse apres un delete. Il ne devrait pas passer a NULL ?
    Non.
    Losque tu fais un delete (ou un Release, puisqu'apparemment c'est la m�me chose) le syst�me d�salloue la m�moire mais il ne r�initialise pas le pointeur. Si tu tiens absolument � le passer � NULL (ce qui peut servir pour des tests ult�rieurs par exemple) il faut le faire "� la main":

  5. #5
    Membre �m�rite
    Inscrit en
    Mai 2002
    Messages
    673
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par d�faut
    Et est-ce que le delete est suppos� lib�rer de fa�on r�cursive tous les pointeurs contenus dans la class/structure pass�e en param�tre ?

    Cela est-il pr�vu dans le destroy des class que j'utilise ?

    J'ai vraiment l'impression d'�tre devant un probl�me insoluble... j'ai beau mettre des delete partout, mon prog continu a gonfler quand je le fait pas planter...

    J'ai tester en dehors de ce module, je ne fait aucun new() ni malloc() (a part une fonction de file, qui elle se d�saloue bien)...

    des id�es ?

  6. #6
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par gloubi
    Et est-ce que le delete est suppos� lib�rer de fa�on r�cursive tous les pointeurs contenus dans la class/structure pass�e en param�tre ?
    Si la classe concern�e est bien programm�e, oui. Si c'est une classe que tu impl�mentes toi-m�me, c'est � toi de g�rer la lib�ration de m�moire des objets qu'elle contient.

    Citation Envoy� par gloubi
    Cela est-il pr�vu dans le destroy des class que j'utilise ?
    C'est une classe de la MFC, donc sans h�sitation: oui.

    Citation Envoy� par gloubi
    J'ai vraiment l'impression d'�tre devant un probl�me insoluble... j'ai beau mettre des delete partout, mon prog continu a gonfler quand je le fait pas planter...

    J'ai tester en dehors de ce module, je ne fait aucun new() ni malloc() (a part une fonction de file, qui elle se d�saloue bien)...

    des id�es ?
    Comme �a, c'est difficile. Les fuites m�moires sont souvent difficiles � localiser. Beaucoup de sujets en parlent sur le site, avec une petite recherche, tu devrais trouver beaucoup d'indications. Par exemple: http://www.developpez.net/forums/sho...uite+m%E9moire

  7. #7
    Membre �m�rite
    Inscrit en
    Mai 2002
    Messages
    673
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par d�faut
    Merci pour la piste, je vais potasser �a et je vous tien au courrant

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Attention, pour une interface COM/OLE, il ne faut faire ni delete ni free().
    Juste l'appel � Release(), puis on met le pointeur � NULL.

    Normalement, il faut � un Release "par interface".
    C'est-�-dire que chaque appel � CoCreateInstance(), QueryInterface() ou AddRef() doit avoir un Release() qui lui correspond (et � mon avis, le GetDocument() contient un AddRef(), donc il faudra faire Release() � la fin).

    Note: �vitez de tester les pointeurs en retour de QueryInterface() : C'est la valeur de retour qu'il faut tester, avec la macro SUCCEEDED() ou FAILED().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre �prouv�
    Inscrit en
    Avril 2004
    Messages
    122
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par d�faut
    Salut,
    Effectivement, apparemment il manque un release sur lpDispatch et j'ajouterai aussi que les BSTR doivent �tre d�salou�s une fois que l'on ne les utilise plus ou avant de les r�utiliser avec un jolie SysfreeString sinon grosses pertes de blocs !

  10. #10
    Membre �m�rite
    Inscrit en
    Mai 2002
    Messages
    673
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par d�faut
    meric beaucoup ^^
    je vais jetter un oeil a tout �a :p

Discussions similaires

  1. [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
  2. [Fuites m�moire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    R�ponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite m�moire
    Par eag35 dans le forum MFC
    R�ponses: 4
    Dernier message: 02/02/2005, 12h46
  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