Dynamischer speicher
-
Wie gesagt, da fehlt der Zuweisungs-Operator (operator=). Du hast dort zwei String-Objekte angelegt (s und den temporären String("Wau")) und weißt diese einander zu. Der vorgegebene op= kopiert nur die direkten Datenelemente (also len und str), aber nicht das dahinterliegende char-Array, so daß nach der Zuweisung beide Objekte den selben Speicher verwalten.
Anschließend rufen beide Objekte delete[] für diesen Speicher auf (der temporäre String am Ende der Zuweisung, s hinter dem return 0) - und schon kracht es, weil du Speicher freigeben willst, der dir gar nicht (mehr) gehört.
-
-
Ich dachte dieses Problem wird durch den CopyKon. gelöst oder habe ich da was falsch verstanden ? Weil der soll doch grade so eine Zuweisung ermöglichen.
-
Schau Dir mal den Artikel von Hume an (siehe oben)
-
Wusler schrieb:
Ich dachte dieses Problem wird durch den CopyKon. gelöst oder habe ich da was falsch verstanden ? Weil der soll doch grade so eine Zuweisung ermöglichen.
Nein, eben nicht. Der Copy-Ctor wird nur für Direkte Initialisierungen (z.B. "String s = String("Wau");") verwendet, für Zuweisungen gibt es einen eigenen Operator (der muß sich schließlich auch darum kümmern, die alten Daten deines Strings wieder freizugeben).
-
Ich bin momentan nich so fit in c++, darum frag ich einfach mal:
Gibt es keine fertigen guten String Klassen ? (Schon beim Standard dabei?)
-
std::string
-
Danke dir CStoll, dass ergibt natürlich Sinn
Und ja diese Stringklasse ist mir bekannt, aber ich darf meine eigene Stringkalssen schreiben, weil das unser Dozent so will
-
Die Antwort war auch eher für xindon gedacht
-
Knuddlbaer schrieb:
std::string
std:string ist keine Klasse - nur ein typedef
-
Man kann auch jemanden, der frisch mit C++ angefangen hat, den Typedef auflösen und ihn dann damit alleine lassen.
Ich denke nicht, das ein
basic_string<char>
die richtige Antwort auf die Frage ist.
Eigentlich müsse man ja, um exakt zu sein,
template < class CharType, class Traits=char_traits<CharType>, class Allocator=allocator<CharType> > class basic_string
noch mit angeben.
Aber drehen wir das doch mal um:
Warum ist der Typedef keine Klasse ? So ist es doch ein "stellvertretender" Ausdruck für die Klasse basic_string<char>