FreeImage speicherleck?



  • Wenn ich folgenden Code(aufs wesentliche reduziert) bei mir ausführe frisst er in Sekunden meinen Speicher weg!
    Was mache ich falsch?
    Mein Compilier ist MinGw (ja hier gehts um VC++ ich finde hier passt es am ehersten rein, wenn nicht bitte verschieben)

    for(;;){
    	FIBITMAP *srcBitmap;
    	srcBitmap=FreeImage_Load(FIF_BMP, "c:\\test.bmp", 0);
    	int width,height;
    	width = FreeImage_GetWidth(srcBitmap);
    	height = FreeImage_GetHeight(srcBitmap);
    	FIBITMAP *bitmap=FreeImage_Allocate(width,height,8);
    	bitmap=FreeImage_ConvertTo8Bits(srcBitmap);
    	FreeImage_Unload(bitmap);
    	FreeImage_Unload(srcBitmap);
    }
    

    Vielen Dank für euere Hilfe


  • Mod

    Du allokierst mit FreeImage_Allocate ene Bitmap deren Zeiger nicht ferigegeben wird. Dieser Zeiger wird durch FreeImage_ConvertTo8Bits überladen.

    IMHO ist der Aufruf von FreeImage_Allocate hier für die Füsse.



  • sugi schrieb:

    Mein Compilier ist MinGw (ja hier gehts um VC++ ich finde hier passt es am ehersten rein

    na die logik dahinter würde ich gern verstehen, warum der beitrag hier am ehesten reinpasst. im vergleich zu rund um die programmierung oder spiele-/grafikprogrammierung. 🙂



  • Vielen dank jetzt gehts

    FreeImage_Allocate hatte ich aus einen Beispiel raus und dachte das man die Funktion vorher aufrufen muss (c++ versteh ich noch ned so richtig)

    @cpt. obvious hast recht in "rund um die programmierung" hätte es auch reingepasst aber spiel solls keins werden



  • Jetzt hab ich gleich noch eine blöde Frage
    Ich hab eine Klasse gebastelt die mir einen screenshot macht und ihn als FIBITMAP zurückgibt per return gehts und byref nicht(Fehler festgestellt und muss beendet werden).
    Warum?

    so gehts nicht

    ...
    void XXX::Screenshot(FIBITMAP *grey){
    	...
    	grey=FreeImage_ConvertTo8Bits(screenshot);
    	FreeImage_Unload(screenshot);
    }
    
    int main(void){
    	XXX *scr=new XXX();
    	FIBITMAP *screenshot;
    	scr->Screenshot(screenshot);
    	FreeImage_Unload(screenshot);
    	delete(stream);
    	...
    }
    

    So gehts

    ...
    FIBITMAP *XXX::Screenshot(){
    	...
    	grey=FreeImage_ConvertTo8Bits(screenshot);
    	FreeImage_Unload(screenshot);
    	return grey;
    }
    int main(void){
    	XXX *scr=new XXX();
    	FIBITMAP *screenshot;
    	screenshot=scr->Screenshot();
    	FreeImage_Unload(screenshot);
    	delete(stream);
    	...
    }
    

  • Mod

    Du müsstest das als Pointer Pointer ** oder als Pointer Referenz.

    FIBITMAP *&grey



  • Das ist mir im moment noch zu hoch 😕 mir ist ein Zeiger schon zuviel damit werd ich mich mal befassen falls ich mit irgentwann mal mit c++ angefreundet hab.

    Danke für deine Antwort.



  • Solltest du vorher tun... definitiv!


Anmelden zum Antworten