Programm stürtzt nach ca. 3 Minuten ab.



  • wie GDI Leak?



  • Ich meinte das er GDI (für die Grafik) Resourcen nicht (richtig) freigeben hat.



  • Das Programm hat keinen besonderen aufbau. Ich vermute den Fhler in der Funktion:

    char* time();
    

    hier die Funktion:

    char* time()
    {
    			GetSystemTime(&st);
    			char* zeit = new char[8];
    			char temp[8];
    			int i1 = (int)(st.wHour);
    			int i2 = (int)(st.wMinute);
    			int i3 = (int)(st.wSecond);
    			i1+=2;
    			itoa(i1, temp, 10);
    			if (1==lstrlen(temp))
    				lstrcat(temp, TEXT("0"));
    			lstrcpy(zeit,lstrcat(temp,TEXT(" : "))); // 	"hh : "
    			itoa(i2, temp, 10);
    			if (1==lstrlen(temp))
    				{
    				char zb[8];
    				lstrcpy(zb,"0");			
    				lstrcat(zb, temp);
    				lstrcpy(temp,zb);			
    				}			
    			lstrcpy(zeit,lstrcat(zeit,temp)); // 			"hh : mm"
    			lstrcpy(zeit,lstrcat(zeit,TEXT(" : "))); // 	"hh : mm : "
    			itoa(i3, temp, 10);
    			if (1==lstrlen(temp))
    				{
    				char zb[8];
    				lstrcpy(zb,"0");			
    				lstrcat(zb, temp);
    				lstrcpy(temp,zb);			
    				}			
    			lstrcpy(zeit,lstrcat(zeit,temp)); // 			"hh : mm : ss"
    
    			return zeit;
    }
    


  • Sry für den sehr schlechten Stil aber habe die Funktin heute Morgen um 2 fertiggestellt und als ich sah dass ich damit die Uhrzeit anzeigen kann war ich froh und ging pennen.



  • nein ich meinte das:

    char *copy_and_alloc_string(char *src)
    {
       char *ret;
    
       ret = new char[strlen(src)];       // Und HIER ist der Fehler, weil es strlen+1 heissen müsste, wegen der 0 am ende des strings!
    
       strcpy(ret, src);
    
       return ret;
    }
    


  • Warum benutzt Du nicht sprintf?

    sprintf(zeit, "%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond);
    

    😕

    Dann solltest Du gleich GetLocalTime() benutzen, dann kannste Dir das "+2" für die Stunden sparen...

    An sonsten fällt mir nur auf, das Du zwar mit new Speicher holst, ihn aber nicht wieder freizugeben scheinst...



  • Der Speicher wird später (nach dem zurückliefern von 'zeit') extern verarbeitet und deleted.

    PS: Es handelt sich hier um eine GUI Anwendung. Ausserdem nutze ich sehr ungern Standard-Funktionen die ich sehr leicht selber bsteln kann.



  • tolga schrieb:

    PS: Es handelt sich hier um eine GUI Anwendung.

    ...und?

    tolga schrieb:

    Ausserdem nutze ich sehr ungern Standard-Funktionen die ich sehr leicht selber bsteln kann.

    Oh. Ja, ich programmiere auch lieber 20 Zeilen selber anstatt eine standard-Funktion zu benutzen, die dann mit 1 einzigen Zeile auskommt...

    Trotzdem reservierst Du Platz für 8 Zeichen, willst aber 13 Zeichen drin unterbringen ("00 : 00 : 00" ist nicht gleich "00:00:00")...



  • ich ahbe es zum testen auch schon mit 255er bufefrn versucht. nach ca. 3 min schmierts ab. Und 12 passt in 255. ganz sicher. Ausserdem klappts auch komischerweise mit 8er buffer und trotzdem 12 zeichen. Kann ichmir auch cniht erklären.



  • Einfach mal als "Release" statt "Debug" compilieren, dann stürzt es auch mit einem 8-Zeichen-Buffer ab.

    Blackbird



  • Was sagt denn der Task-Manager bei deinem Programm zu verwendetem Speicher und Anzahl GDI-Objekte? Steigen die Werte immer weiter an -> Memory-Leak 😉



  • Im taskmanager habe ich als erstes geschaut gehabt. Da passiert nix. Nach einmal minimieren und wieder maimieren sinkt der speicher schon auf 460kb; dann steigt er in paar sekunden auf 1400kb und bleibt konstant.



  • Hast du auch im Taskmanager die GDI-Objekt Spalte hinzugefügt? Im Menü unter Ansicht.



  • Thx asdf. Du hast es in dir!
    Das ist es. ich ahbe einen Timer mit Interval=1000;
    und jede sekunde kommt ein GDI-Objekt dazu. Also ahbe ich sicher einen Fehler in der WNDPROC in die WM_TIMER kommt oder in einer funktionen die aufgerufen werden bei WM_TIMER.
    Werde der Sache nachgehn..



  • Dann scheinst du wohl bei jedem Aufruf neue GDI-Objekte zu erstellen, ohne diese nachher auch wieder freizugeben 😉


Anmelden zum Antworten