String-Klasse stürzt ab
-
Hallo, ich habe ein Problem mit meiner String-Klasse. Sobald ich das
delete[] chars;in der Reserve-Funktion auskommentiere stüzt das Programm ab. Jemand eine Idee woran das liegt? Ich bin echt ratlos.
-
Bitte noch die Klassendefinition zeigen.
-
Auf den ersten Blick fehlt schonmal der Zuweisungs-Operator
String& operator=(const String& other);, also legt der Compiler bei Bedarf einen eigenen an, der allerdings nicht zu deinem Kopier-Konstruktor und Destruktor passt.Ansonsten wäre es hilfreich, wenn du mal den Anwendungscode postest, bei dem der Fehler auftritt - und im Debugger genau verfolgst, wo das Programm abstürtzt.
PS: Was hast du eigentlich gegen std::wstring?
-
Auf den ersten Blick sehe ich 2 Probleme:
1. in Clear wird das delete immer ausgeführt, das ist für sich genommen kein Problem, allerdings wird chars im Anschluss auch nicht auf 0 gesetzt. Das für dann zu doppelter Freigabe führen wenn jemand z.B. zweimal Clear aufruft oder nach einem Clear der Destruktor ausgeführt wird.
2. An dem delete in reserve ist nicht per se etwas auszusetzen, allerdings gibt es ggf. ein Problem wenn zuvor Clear aufgerufen wurde (s.o.)
Es wird nicht geprüft, of capacity < length gilt, in diesem Fall würde zuviel kopiert werden.Da du ohnehin die wcs-Funktionen benutzt - warum nicht auch wcscat statt der manuellen Kopien in Append?
-
@camper
Danke dir. Ich musste in der Clear()-Funktion nochchars = nullptr;einfügen. Muss man dann nicht auch normale Pointer besser auf "nullptr" setzen, oder ist das wieder was anderes?
-
Student83 schrieb:
@camper
Danke dir. Ich musste in der Clear()-Funktion nochchars = nullptr;einfügen. Muss man dann nicht auch normale Pointer besser auf "nullptr" setzen, oder ist das wieder was anderes?
Was ist denn ein normaler Pointer? Du musst auch überhaupt nichts 0 setzen, wenn entsprechende Invarianten gelten.
Impliziert beispielsweise capacity==0 => chars==0 (und length == 0 sowieso), könnte das als Test genügen:void String::Clear() { if ( capacity != 0 ) { delete[] chars; capacity = 0; length = 0; } }Das kann unter Umständen auch dem Compiler helfen, besser zu optimieren.
Wie schon zuvor von CStoll erwähnt, eine copy-Zuweisung implementieren müssen.
Den Zuweisungsopertor für wchar_t solltest du evtl. auch noch einmal überdenken (im Prinzip ist er ohnehin überflüssig):String foo = L"abcd"; foo = foo.ToCString(); // ups