Speicherleck
-
Hallo,
mein Programm hat ein Speicherleck und ich konnte dieses bislang auf diesen Code eingrenzen, da weiß ich allerdings nicht mehr weiter:
CoInitialize(NULL); string strTemp; if(hInst!=NULL) { UINT msg; CComPtr<IHTMLDocument2> spDoc; LRESULT lRes; msg = RegisterWindowMessage(_T("WM_HTML_GETOBJECT")); SendMessageTimeout(IE_hwnd, msg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes); LPFNOBJECTFROMLRESULT pfObjectFromLresult=(LPFNOBJECTFROMLRESULT)::GetProcAddress(hInst,LPCSTR("ObjectFromLresult")); if ( pfObjectFromLresult != NULL ) { HRESULT hr; hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument2, 0, (void**)&spDoc ); if ( SUCCEEDED(hr) ) { //CComPtr<IDispatch> spDisp; CComPtr<IHTMLElement> pHTMLElement; hr=spDoc->get_body(&pHTMLElement); BSTR bstrText; pHTMLElement->get_innerText(&bstrText); strTemp=(char *)_bstr_t(bstrText); pHTMLElement.Release(); } } } CoUninitialize(); return strTemp;Muss da noch irgendwas released werden? ist das pHTMLElement.Release(); überhaupt richtig?
danke im voraus
veio
-
Bin gerade auf die grandiose Idee gekommen, das einfach weiter aus zu kommentieren und zu testen, ob das speicherleck weg ist.
pHTMLElement->get_innerText(&bstrText);
löst das speicherleck wohl aus.
Wie gebe ich den Speicher korrekt wieder frei?
-
Ich schätze einfach mal, dass get_innerText Speicher für Dein BSTR (bstrText) alloziert und Du diesen freigeben musst (SysFreeString).
Evtl. kannst Du auch CComPtr dafür verwenden, damit Du Dich selbst nicht um die Freigabe kümmern brauchst.
-
Und wie gebe ich den Speicher wieder frei? Tut mir leid, bin da nicht so bewandert

edit: hm sysfreestring stand da eben doch noch net :p
-
Stimmt, habs noch hinzugefügt

Funktionierts denn?!
-
super, es klappt, danke
