Absturz durch globalen String?



  • Hallo!
    Derzeit arbeite ich an einem größerem Programm,und habe ein Problem:
    Ich habe einen globalen String,welcher das Ergebnis des Datei-Öffnen-Dialogs speichert.Er bekommt eine Kopie eines Feldes der Größe MAX_PATH,das vorher mit ZeroMemory platt gemacht wurde,zugewiesen.
    Wenn ich das Programm nun beende,und nur dann(!),stürzt es ab,mit dem Hinweis auf eine üngültige Speicherstelle.
    Wenn ich den String jedoch zuvor mit ="" kaputt mache,geschieht dies nicht.
    Wieso verursacht das so ein Problem?
    Der String ist im ersten Teil mit den richtigen Zeichen gefüllt,im Rest dann ja nur noch mit Nullen.Dennoch liefert size() MAX_PATH.
    Vielleicht könnt ihr mir ja dabei helfen.
    g_e.
    PS:ich weiß,eigentlich solle man Quellcode posten,aber in diesem Fall ist das etwas schwierig,weil das Problem recht tief im Programm liegt,und eine Menge drumherum existieren muß.



  • Zeig uns doch nur, wie du das mit dem FileOpen-Dialog gemacht hast.



  • Was ist Dein 'globaler String' ???

    Ist das 'n char- Pointer, 'n char- Vektor oder was anderes?

    char *Satz; oder
    char Satz[50]; ???

    Kann es sein, dass Du in die Variable zu viel Text speicherst? Dann passiert genau das! (Hinter globalen Variablen kommt irgendwo der Programmcode, den du ev. ueberschreibst?)



  • Ok,hier dann mal der Code der eigentlichen Funktion:

    string Hilfsfunktionen::DateiDialog(HWND HNDL_Besitzer,string str_titel,string str_standart_datei,OPENFILENAME* zgr_ofn,bool b_oeffnen_dialog)
    {
    
    char* f_standart_datei=new char[256];
    ZeroMemory(f_standart_datei,256);
    strncpy(f_standart_datei,str_standart_datei.c_str(),str_standart_datei.size());
    //______________________Voreingestellter Dateiname_______________________
    char* f_titel=new char[256];
    ZeroMemory(f_titel,256);
    strncpy(f_titel,str_titel.c_str(),str_titel.size());
    //______________________Titel des Dialogs________________________________
    char* dateiname=new char[MAX_PATH+1];
    dateiname[MAX_PATH]=0;
    ZeroMemory(dateiname,MAX_PATH+1);
    //______________________Speicher für Rückgabewert_________________________
    DialogInitialisieren(zgr_ofn);
    
    zgr_ofn->hwndOwner         = HNDL_Besitzer ;
    zgr_ofn->Flags             =OFN_HIDEREADONLY | OFN_CREATEPROMPT;
    
    zgr_ofn->lpstrFileTitle    = dateiname;
    zgr_ofn->lpstrTitle        = f_titel;
    
    if(str_standart_datei.size()>0) zgr_ofn->lpstrFile         =f_standart_datei;
    else zgr_ofn->lpstrFile         =NULL;
    //__________________Entscheide,welcher Dialog gezeigt werden soll,und rufe auf!_____________
    if(b_oeffnen_dialog) {if(GetOpenFileName(zgr_ofn)==0) {return (" ");}}
    else { if(GetSaveFileName(zgr_ofn)==0) {return (" ");}}
    string str_dateiname(dateiname,MAX_PATH);
    delete[] dateiname,f_titel,f_standart_datei;//______________Aufräumen___________
    return str_dateiname;
    }
    

    Und:

    void Hilfsfunktionen::DialogInitialisieren(OPENFILENAME* zgr_ofn)
    {
    ZeroMemory(zgr_ofn, sizeof(OPENFILENAME));
         zgr_ofn->lStructSize = OPENFILENAME_SIZE_VERSION_400;
         zgr_ofn->hInstance         = NULL ;    
         zgr_ofn->lpstrFilter       = NULL ;    
         zgr_ofn->lpstrCustomFilter = NULL ;    
         zgr_ofn->nMaxCustFilter    = NULL;
         zgr_ofn->nFilterIndex      = NULL ;
         zgr_ofn->nMaxFile          = MAX_PATH ;
         zgr_ofn->nMaxFileTitle     = MAX_PATH ;    
         zgr_ofn->lpstrInitialDir   = NULL ;    
         zgr_ofn->nFileOffset       = 0 ;           
         zgr_ofn->nFileExtension    = 0 ;
         zgr_ofn->lpstrDefExt       =NULL ;
         zgr_ofn->lCustData         = 0L ;          
         zgr_ofn->lpfnHook          = NULL ;    
         zgr_ofn->lpTemplateName    = NULL ;
    }
    

    Wo liegt der Fehler?
    g_e.

    [ Dieser Beitrag wurde am 16.04.2003 um 13:25 Uhr von ghost_error editiert. ]



  • delete[] dateiname,str_standart_datei,str_titel;
    

    😕 😕 😕
    Wie kommt man auf sowas?



  • Sch...das hatte ich vergessen.
    Ja,das liegt daran,das ich einiger Zeit lang die Argumente anders benannt habe,daher war delete[] schon richtig,weil ursprünglich damit Felder gemeint waren.
    Besser ich ändere das mal...
    g_e.



  • delete a, b;

    sieht vollständig geklammert so aus:

    (delete a), b;

    wie man sieht wird nur a deletet, nicht, wie anscheinend beabsichtigt, a und b.



  • So,ich habe delete[] geändert.
    Mittlerweile hat sich das Problem auch erledigt,durch die Zeile

    str_dateiname=str_dateiname.substr(0,str_dateiname.find(char(0)));
    

    Danke für eure Hilfe!
    g_e.


Anmelden zum Antworten