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.