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 🙂


Anmelden zum Antworten