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) :
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
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
Ce qui devrait désaloué tout ce petit monde.
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();
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 :
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 :/
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));
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
Partager