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
