delete verursacht Fehler



  • Hoi!

    Also folgendes Prob:
    delete Verursacht einen Fehler, aber ich hab KA warum. Meine Code sieht so aus

    int CWetterstation::SaveData()
    {
        ofstream FTarget;
        ofstream FIndex("index.dat", ios::app);     // Indexdatei öffnen    :   anhängen/erzeugen
        char* temp = new char[29];
    
        if(FIndex.is_open())
        {
            // Dateiname erzeugen
            strcpy(temp, SystemZeit);
            for (int i=0; i<22; i++)
            {   
                if(isspace(temp[i]))
                    temp[i] = '_';
                if(temp[i]==':')
                    temp[i] = '_';
            }
            temp[24] = '_';                         // Ekligen Zeilenumbruch entfernen ;)
            strcat(temp,".txt");
            // Dateiname ist erzeugt
    
            FTarget.open(temp, ios::out);           // Zieldatei öffnen :   schreiben
    
            // Daten speichern
            FIndex << temp << endl;                 // Dateinamen im Index speichern
            FTarget << "DatumUhrzeit " << SystemZeit;
            FTarget << "Helligkeit " << sWetter.iHelligkeit << endl;
            FTarget << "Luftdruck " << sWetter.iLuftd << endl;
            FTarget << "Luftfeuchte " << sWetter.iLuftf << endl;
            FTarget << "Niederschlag " << sWetter.iNieder << endl;
            FTarget << "Temperatur " << sWetter.iTemp << endl;
            FTarget << "Windgeschwindigkeit " << sWetter.iWindg << endl;
            FTarget << "Windrichtung " << sWetter.iWindr << endl;
            // Daten gespeichert
    
            FTarget.close();
            FIndex.close();
        }
        else
        {
            cout << endl << "error" << endl;
            return -1;
        }
    
        delete[] temp;              // <-- FEHLER!!
    return 0;
    }
    

    SystemZeit ist ein char* der wie folgt generiert wird(und private ist)

    void CWetterstation::SetTime()
    {
        time_t SysZeit;
        SysZeit = time(NULL);
        SystemZeit = asctime(localtime(&SysZeit));
    }
    

    Ich hoffe ihr könnt mir helfen.



  • Wieder mal 'ne Frage für Hellseher.



  • ich vermute, dass das

    if(FIndex.is_open())
        {
            // Dateiname erzeugen
            strcpy(temp, SystemZeit);
    

    (ganz am anfang)
    den fehler verursacht (der sich aber erst spaeter bemerkbar macht).
    bis du sicher, dass SystemZeit nie mehr als 29 zeichen
    enthaelt?



  • Nach meiner Doku ist der String, den asctime() liefert 26 Zeichen lang:
    strcpy(temp, SystemZeit);
    plus vier Zeichen:
    strcat(temp,".txt");
    und dann braucht's ja auch noch ein Nullbyte. Macht 31 Zeichen. temp ist aber nur 29 Zeichen groß.

    Stefan.



  • Original erstellt von Geo:
    Wieder mal 'ne Frage für Hellseher.

    Ne. Das is eher einfach... (Und unseren täglichen Segfault gib uns heute... 😃 - zur Not eben auch mit kill -11)



  • Aha! Danke ^^ Funzt
    Kom,isch, die Doku die ich gefunden hab sachte es währen 22 Zeichen. Das ging aba nit und darum habbich durchgezählt, aber irgendwas mussich dabei übersehen haben ^^'



  • @THE_FreaK
    Kleiner Tipp: Teste deine Annahmen. Wenn du glaubst, dass der String niemals länger als 22 Zeichen sein wird, dann mach diese Annahme explizit im Code deutlich. Hier wäre z.B. ein simples assert eine gute Sache:

    if(FIndex.is_open())
    {
        // Dateiname erzeugen
        assert(strlen(SystemZeit) <= 22);
        strcpy(temp, SystemZeit);
    

    Die magische Nummer 22 in der Schleife gehört natürlich auch da weg. Wenn schon dann
    strlen(SystemZeit).

    In diesem konkreten Fall wäre es angebracht gewesen, wenn du mit der Definiion solange gewartet hättest, bist du alle für die Initialisierung benötigten Werte zusammen hast:

    char* temp = 0;
        if(FIndex.is_open())
        {
            // Dateiname erzeugen
            temp = new char[strlen(SystemZeit) + strlen(".txt")+1]
            strcpy(temp, SystemZeit);
    ...
    

    Oder noch besser wenn du auf das explizite rumhantieren mit Speicher verzichten würdest:

    if(FIndex.is_open())
    {
        const char* const dateiEndung(".txt");
        string dateiName(SystemZeit); // ein guter Name spart häufig ein Kommentar
        // noch besser wäre es natürlich, wenn du den ganzen Algo in eine extra
        // Methode rausziehen würdest.
    ...
    

    [ Dieser Beitrag wurde am 06.06.2003 um 00:17 Uhr von HumeSikkins editiert. ]


Anmelden zum Antworten