Absturz bei Konvertierung Int -> String



  • Hallo zusammen,

    ich sitze momentan an einem plattformübergreifenden (Windows / OSX) Projekt. Mithilfe einer Klasse "Store" will ich Werte (mit zugehörigem Schlüssel) in eine Textdatei schreiben, Syntax "Schlüssel = Wert", wobei Wert verschiedene Datentypen annehmen kann. Dafür wandle ich sämtliche Werte vor dem Schreiben in Strings um. Dieses Prozedere funktioniert auf OS X tadellos, während das Programm auf Windows abstürzt. Hier der entsprechende Code:

    class Store {
    private:
        char* file;
        map<string,string> values;
        bool saved;
    
    public:
        Store(char* file);
        // Speichert den Pfad und läd die Datei mit load()
        // file => Dateipfad für Storedatei
    
        string getString(string key, string def);
        string getString(string key);
        //Holt einen gespeicherten String.
        //key => Schlüssel für Wert (Variablenname)
        //def => Defaultwert, falls Schlüssel nicht vorhanden. ( wenn nicht angegeben, "")
    
        int getInt(string key, int def);
        int getInt(string key);
        //Holt einen gespeichertes Int.
        //key => Schlüssel für Wert (Variablenname)
        //def => Defaultwert, falls Schlüssel nicht vorhanden. ( wenn nicht angegeben, 0)
    
        void setString(string key, string value);
        //Speichert einen String
        //key => Schlüssel unter dessen Name der Wert gespeichert wird.
        //value => Wert zum speichern im Typ string
    
        void setInt(string key, int value);
        //Speichert ein Int
        //key => Schlüssel unter dessen Name der Wert gespeichert wird.
        //value => Wert zum speichern im Typ int
    
        bool hasKey(string key);
        // Prüft ob ein Schlüssel vorhanden ist.
        // key => Schlüssel, der überprüft wird
        //@returnvalue => true = vorhanden, false = nicht vorhanden
    
        bool load();
        //Läd eine Datei
        //@returnvalue => true = geladen, false = nicht geladen (datei möglicherweise nicht vorhanden, kann ignoriert werden)
    
        bool save();
        //Speichert eine Datei
        //@returnvalue => true = gespeichert, false = möglicherweise fehlerhafter Pfad.
    };
    

    In diesem Teil der Methoden stürzt das Programm ab:

    void Store::setString(string key, string value) {
    	saved=false;
        values[key] = value;
    }
    
    void Store::setInt(string key, int value) {
        char* c = new char[40];
        sprintf(c, "%d", value);
        string v(c);
        setString(key, v);
    }
    

    Aufgerufen wird das ganze von außerhalb:

    str->setInt("xres", 1024);
    

    "str" wird vorher über "new" initialisiert. Ich verwende VC++ 2010. Gibt es da irgendwelche Eigenheiten, die dazu führen, dass derselbe Code auf OSX tadellos funktioniert, während er hier abstürzt?



  • Was mir spontan auffällt, ist, das der für c angeforderte Speicher nicht wieder freigegeben wird. Das könnte natürlich irgendwann mal (kA, wie oft die Methode aufgerufen wird) zu Speichermangel führen ...

    void Store::setInt(string key, int value) {
        char* c = new char[40];   //new ohne zugehöriges delete
        sprintf(c, "%d", value);
        string v(c);
        setString(key, v);
    }
    


  • Danke, ist geändert. Was mir noch auffällt: Wenn ich in Visual Studio einstelle, dass ich mit Unicodeunterstützung kompilieren will, stürzt das Programm nicht ab, macht dafür aber überhaupt nichts. Selbst Ausgaben über printf / cout erscheinen nicht in der Konsole.



  • Huhu :3

    ich bin der Mitprogrammierer jenes Projekts, der sich um die OSX-Anpassungen kümmert.

    das mit dem delete tut mir leid das hatte ich wohl vergessen 😃

    aber leider führt das nicht zur lösung des problems 😕



  • Ich konnte das Problem mittlerweile soweit eingrenzen, dass ich herausgefunden habe, dass das Program bei

    saved = false;
    

    den Geist aufgibt. Ob das jetzt im ursächlichen Zusammenhang steht oder einfach nur zufällig passiert, weiß ich allerdings nicht.



  • Kann zu, eigene Blödheit war hier der Fehler. Store wurde doch nicht richtig initialisiert.


Anmelden zum Antworten