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!


Anmelden zum Antworten