Programm stürtzt nach ca. 3 Minuten ab.
-
Ich ahbe ein kleines Proggy dass nach ca 3 Minuten einfach so abstürtzt.
Im Leerlauf läuft absolut nciht als der Timer, der die Uhrzeit aufm Bildschirm ausgibt.Woran kann ein solcher Absturz liegen??
-Ich denke irgendwo läuft ein Buffer über.
Was denkt ihr??
-
sag uns mal was dein programm tun soll und wie es aufgebaut ist.
Vielleiht ein Buffer oder so was. Ein häufiger fehler ist auch, wenn du einen string allokierst dass du ein zeichen zu wenig lockst und er deswegenb segfaultet.
Wie gesagt: ohne nähere Beschreibung können wir dir nicht helfen.
-
GDI Leak?
-
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
