Memory Leaks



  • Hallo an alle,

    ich hab in meinem Programm ein großes Problem mit Memory Leaks! Das Prog soll mehrere Tage durchlaufen, aber spätestens am 2. Tag ist dann immer schluss.

    Mit einem Hilfprogramm konnte ich schon ein paar leaks finden. Beheben konnte ich sie bisher nicht, dazu reichen meine c++ Kenntnisse anscheinend nicht aus.

    Hier sind mal ein paar Ausschnitte. Die leaks hab ich immer mit nem Pfeil markiert:

    // Parameter der Methode: CString& sLine
    
    int * curPos = new int();
    *curPos = 0;
    CString* temp = new CString();
    
    *temp = sLine.Tokenize(" \t", *curPos);	// <----
    
    delete curPos;
    delete temp;
    
    FILE* datei; 
    datei=fopen(strPfad,"r"); 
    [...]
    
    char  array[260]; 
    
    string *Line = new string;
    *Line = fgets(array,  sizeof( array ) , datei);   // <----
    
    delete Line;
    Line = NULL;
    
    // Parameter der Methode: CString& line, int &pos
    
    int *old_pos = new int;
    *old_pos = pos;
    
    int *limiter_pos = new int();
    *limiter_pos = line.Find(limiter,pos);
    
    CString s;
    
    s =line.Mid(*old_pos,*limiter_pos - *old_pos);		// <---
    
    delete old_pos;
    delete limiter_pos;
    
    return s;
    
    // Parameter der Methode: CString& result
    
    double *value = new double;
    *value = 2.123;
    int *precision = new int();	
    *precision = 0;			
    
    result.Format("%.*lf", *precision, *value);	// <----
    
    delete precision;
    delete value;
    

    Ich hoffe, mir kann da jemand helfen die leaks zu beseitigen



  • Warum legst Du alle deine Objekte auf dem Heap an?
    Ist gar nicht nötig. Dann hast Du auch keine Leaks mehr.

    Bsp:

    int curPos = 0;
    CString temp = sLine.Tokenize(" \t", curPos);
    

    Simon



  • Das hatte ich urspünglich auch. Aber es wurde da trozdem ein leak angezeigt.
    Ich teste das am Besten nochmal um ganz sicher zu gehen



  • fclose(..) nicht vergessen bei den File Operationen!



  • 2. Tag ist dann immer schluss

    Was heisst Schluss?



  • fclose() hab ich schon.

    Ich selber hab nicht die Zeit das Programm 2 Tage durchlaufen zu lassen. Aber der Kunde hat mir nen Screenshot geschickt mit ner Out of Memory Exception und 1,4 GB Speicherauslastung im Taskmanager. Das Programm ist also abgestürzt



  • Ich hab an ein paar Stellen die Objekte wieder umgebaut. Wird aber troztem noch als leak angezeigt


  • Mod

    Die Leaks müsstest Du auch im Debugger finden...

    Wenn Du allerdings alle Deine Variablen so unsinnig als Zeiger über all angelegt hast, dann wirst Du einfach irgendwo vergessen haben einen freizugeben... 🕶



  • Oh ja, im Debugger steht so einiges, wenn ich ein wenig mit dem Prog arbeite...

    Ich fange am Besten nochmal von vorne an. Hab noch eine Version, bevor ich das mit den Zeigern gemacht hab.
    Trotzdem bin ich dann auch nicht recht viel weiter...

    Hier ist mal der Auszug mit dem Datei einlesen. Wo ist den bei dem fgets ein leak?

    CString strPfad = ...; 
    string Line;							
    
    	FILE* datei; 
    	datei=fopen(strPfad,"r"); 
    
    	if(datei!=NULL) {
    		// Datei ist vorhanden
    
    		char buffer[260];
    
    		while(!feof(datei)){
    
    		fgets (buffer , 260 , datei); // <--
    		Line = buffer;
    
    			if(Line.find("Mode: ") != -1){
    
                                 [..]
    			}			
    		}
    
    		fclose(datei); 
    		delete datei;
               }
    

  • Mod

    Da ist kein Leak. Aber ein überflüssiger und falscher delete des FILE*.
    Wie kommst Du bitte darauf das hier ein delete notwendig ist.
    Schon mal die Doku zu fclose gelesen?



  • Ne, hab ich nicht. Meine c++ Kenntnisse sind nicht so berauschend


Anmelden zum Antworten