Arbeitsspeicher füllt sich obwohl nichts auf den heap gelegt wird



  • Hallo zusammen,

    ich habe in meinem Programm einen Button, der ein paar Bilder ausspucken soll. Wenn ich den Button drücke, setzt er jedesmal ca. einen mb in den Speicher und räumt nicht auf.
    Ich arbeite mit opencv. Die angelegten gezeigten Bilder habe ich wieder alle released.

    Nun habe ich eine Funktion ausgemacht, die mit dem Button angesteuert wird, die der Hauptübeltäter sein muss. Es ist eine Memberfunktion eines Objektes.
    In dieser Funktion wird nichts auf den Heap gelegt, deshalb bin ich davon ausgegangen, dass auch nichts hängenbleibt. Nach dem Ausführen der Funktion sollten ja alle Variablen, die innerhalb der Funktion genutzt wurden, verschwinden. Trotzdem füllt sich der Arbeitsspeicher.

    Hat da jemand von euch ne Idee?
    Oder gibts irgendwo ein Tool, mit dem man sehen kann, welche Variable der Verursacher des Ganzen ist?

    Danke schon mal...



  • Wie lädst/erzeugst du denn die Bilder? Zeig mal ein wenig Code.



  • Also das hier ist unter dem Button

    CvSize size = cvSize(img->width, img->height);
    			IplImage* imgShowProcessed = cvCreateImage(size, img->depth, img->nChannels);
    			IplImage* imgThumbOrigin = ip.resize(img,(img->width)/2, (img->height)/2);
    			IplImage* imgThumbSobel = ip.resize(imgBigSobel,(img->width)/2, (img->height)/2);
    			IplImage* imgThumbLocalContrast = evC.imgBigLocalContrast;
    			IplImage* imgThumbRelativeContrast = evC.visualizeRelativeContrast(imgBig, relativeContrastTolerance);
    			imgThumbLocalContrast = ip.resize( imgThumbLocalContrast,(img->width)/2, (img->height)/2);
    			imgThumbRelativeContrast = ip.resize(imgThumbRelativeContrast,(img->width)/2, (img->height)/2);
    
    			// puzzle pictures
    
    			imgShowProcessed = evA.showProcessedImages( imgThumbOrigin, imgThumbSobel,imgThumbLocalContrast, imgThumbRelativeContrast);
    
    			cvShowImage("Image", imgShowProcessed);
    
    			// clean up			
    
    			cvReleaseImage(&imgShowProcessed);
    			cvReleaseImage(&imgThumbOrigin);
    			cvReleaseImage(&imgThumbSobel);
    			cvReleaseImage(&imgThumbLocalContrast);
    			cvReleaseImage(&imgThumbRelativeContrast);
    

    und das hier ist die Funktion...

    IplImage* C_evaluation::visualizeRelativeContrast(IplImage* img, int relConThresh){
    
    		CvScalar gray = cvScalar(128.0,128.0,128.0);
    		CvScalar white = cvScalar(255.0,255.0,255.0);
    		CvScalar black = cvScalar(0.0,0.0,0.0);
    		CvScalar imgScalar;
    		int h = img->height;
    		int w = img->width;
    		pixelsAboveThresh = 0;
    		pixelsBelowThresh = 0;
    		IplImage* imgRelCon = cvCreateImage(cvSize(img->width,img->height),img->depth, img->nChannels);
    
    		return imgRelCon;
    	}
    

    Ein paar Schleifen hab ich rausgenommen, aber das Problem tritt auch in dieser Form auf.



  • Na ja, die Funktion packt schon was auf den Heap (cvCreateImage), aber du räumst es ja eigentlich an anderer Stelle wieder auf. Auf den ersten Blick sieht das alles schon ok aus. Um sicher zu gehen, dass die Funktion der Übeltäter ist, kannst du sie ja mal rausnehmen und schauen, ob das Leck dann verschwunden ist (falls nicht schon geschehen). Ansonsten deaktivier halt nach und nach immer mehr, bis du das Leck gefunden hast.

    Vielleicht ist das hier auch ganz interessant für dich:

    http://blog.m-ri.de/index.php/2008/10/27/vs-tipps-tricks-heap-bugs-finden-teil-1/


  • Mod

    Kaiaiai schrieb:

    ich habe in meinem Programm einen Button, der ein paar Bilder ausspucken soll. Wenn ich den Button drücke, setzt er jedesmal ca. einen mb in den Speicher und räumt nicht auf.
    Ich arbeite mit opencv. Die angelegten gezeigten Bilder habe ich wieder alle released.

    Woher weißt Du dass der Speicher nicht freigegeben wird?
    Welches Messinstrument benutzt Du?
    Kanst Du mit Sicherheit feststellen, dass sich der Speicherbedarf Deines Programmes immer vergrößert?



  • Na ja, die Funktion packt schon was auf den Heap (cvCreateImage),

    Achso, wusste gar nicht, dass die Bilder auf den Heap gelegt werden. Ich dachte das wird immer mit dem "new" Operator gekennzeichnet.

    Dank dir für die Links. Da werde ich bei Gelegenheit nochmal genauer draufschauen, hab jetzt erstmal einen akzeptablen Workaround gefunden. Ne einfache if Abfrage verhindert, dass die Anweisungen innerhalb des Buttons erneut ausgelöst werden können...außerdem habe ich das Bild in eine Membervariable des Objekts gelegt, die ich dann während des Hauptprogramms wieder leeren kann...hilft erstmal...also am besten alles was man erzeugt in eine Membervariable stecken, damit man auch außerhalb der Funktion drauf zugreifen kann...



  • @ Martin

    Ich schau während der Programmausführung im Debug/Release Modus im Taskmanager auf die Speicherauslastung...ich denke da kann man das gut ablesen oder?



  • Kaiaiai schrieb:

    Na ja, die Funktion packt schon was auf den Heap (cvCreateImage),

    Achso, wusste gar nicht, dass die Bilder auf den Heap gelegt werden. Ich dachte das wird immer mit dem "new" Operator gekennzeichnet.

    Die Funktion wird intern auch new, malloc oder etwas Ähnliches benutzen. Wenn dir eine Funktion ein (fast) beliebig großes Bild erzeugt, kannst du davon ausgehen, dass dieses auf dem Heap liegt. Der Stack wäre dafür auch viel zu klein (der ist höchstens ein paar MB groß).


  • Mod

    Kaiaiai schrieb:

    Ich schau während der Programmausführung im Debug/Release Modus im Taskmanager auf die Speicherauslastung...ich denke da kann man das gut ablesen oder?

    Nein!
    Es heißt nicht, dass Speicher der allokiert wird hier wieder verschwindet.
    Der Heap darf diesen Sepicher sehr wohl weiter intern alsfrei markieren muss diesen aber icht an das OS zurückgeben!

    Wächst der Speicher immer weiter, odermachst Du diese Beobachtung nur einmal?


Anmelden zum Antworten