mit delete[] nach new stürzt prog. ab ohne nicht..
-
hi,
wieso stürzt mein program so ab:case WM_COMMAND: //[...] leng_ = SendMessage(hedit1,EM_LINELENGTH,i,0); buf = new char [leng_]; buf[leng_] = '\0'; SendMessage(hedit1,EM_GETLINE,i,(long)buf); dat_aus << buf; //[...] case WM_DESTROY: delete[] buf; //<- wenn ich das hier weglasse geht alles suppi // mit dem stürzt es ab... dat_aus.close(); PostQuitMessage(0); //[...]
wieso ist das so?
und noch eine frage MUSS ich überhaupt delete[] benützten?? [ich nehm das nämlich noch an anderen stellen...]
BYE [insert username]
-
So wie es aussieht, legst du jedesmal in WM_COMMAND buf neu an und buf ist nicht static -> delete[] buf; muss ans Ende von WM_COMMAND besser gesagt nach dat_aus << buf; kommen
-
hm.. aber egal wo ich delete[] einbaue bekomm ich dann wenn er be delete ist nen "debug error!" und er sagt das hier "DEMAGE: after normal block [...]"
(der error kommt zur laufzeit OHNE das ich den debugger selber eingeschaltet hab..)
hier mal der gesamte (etwas geänderte code):
vorbemerkung: ich bin noch neu also nich hauen weil der code naja... aussieht
HINSTANCE hInstGlb; HWND hedit1,hbut1; char *tex; char *buf; LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { ofstream dat_aus; int leng; int leng_; switch (iMsg) { case WM_CREATE: hedit1 = CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_VSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | ES_LEFT | ES_LOWERCASE,0,0,400,300,hwnd,(HMENU)1,hInstGlb,NULL); hbut1 = CreateWindow("button","auslesen",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,0,310,100,20,hwnd,(HMENU)2,hInstGlb,NULL); SendMessage(hedit1,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); SendMessage(hbut1,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); return 0; case WM_COMMAND: switch(HIWORD(wParam)) { case BN_CLICKED: switch(LOWORD(wParam)) { case 2: dat_aus.open("c:\\hata.xox",ios_base::out); if(!dat_aus) {MessageBox(NULL,"error!","error!",NULL);} leng = SendMessage(hedit1,WM_GETTEXTLENGTH,0,0); tex = new char[leng+1]; SendMessage(hedit1,WM_GETTEXT,leng+1,(long)tex); int i = 0; int isemi = 0; leng_ = SendMessage(hedit1,EM_LINELENGTH,i,0); buf = new char [leng_]; buf[leng_] = '\0'; SendMessage(hedit1,EM_GETLINE,i,(long)buf); for(int i_tmp = 0;i_tmp < leng_;++i_tmp) { if (buf[i_tmp] == ';') ++isemi; }; if (isemi == 0) MessageBox(NULL,"kein semikolon am ende der zeile gesetzt","error",0); else if (isemi == 1) MessageBox(NULL,"OK!",":)",0); else if (isemi > 1) MessageBox(NULL,"zu viele ';' in einer zeile gesetzt","isemi",0); delete[] buf; break; } break; } return 0; case WM_DESTROY: dat_aus.close(); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }
-
Mir ist gerade noch der hier aufgefallen:
buf[leng_] = '\0';
Damit schreibst Du über die Feldgrenzen hinaus. Richtig ist:
buf[leng_-1 ] = '\0';
-
ok das ist nun leicht doof:
wenn ich wie king (wie immer :)) richtig gesagt hat das buf[leng_] ändere bekomm ich keinen error!
NUR steht dann wenn ich dat_aus << buf; bei WM_COMMAND reinsetz in der datei das:
*der text der da drinsteht und das ->*ýýýýÝÝÝÝÝÝÝ
-
*peinlich*
so geht alles...
//[...] buf = new char [leng_+1]; buf[leng_] = '\0'; //[...]
-
trotzdem noch eine grundsätzliche frage:
leicht dumm aber was solls ;):
MUSS ich delete[] aufrufen oder kann ich mir das auch schenken?!
-
Ja du musst delete[] aufrufen sonst gibt es ein Speicherleck, wenn du Glück hast dann räumt Windows für dich auf, aber das ist sehr unwahrscheinlich!
-
schade ich dache meine putze (windoof) räumt mir alles wieder auf
*g*
danke euch!