String & Left
-
Hallo,
ich habe eine eigene String-Klasse. Nun bin ich gerade dabei Left(n) zu implementieren.
Brauche euren Rat. Was ist jetzt besser?DT_String* DT_String::Left(int n) { string str = mpsString; string sub_str = str.substr(0, n); DT_String *ergebnis = new DT_String(sub_str.data()); return ergebnis; }oder
DT_String DT_String::Left(int n) { string str = mpsString; string sub_str = str.substr(0, n); DT_String ergebnis = DT_String(sub_str.data()); return ergebnis; }Merci
-
Zweiteres.
Bei deiner ersten Lösung wäre der Aufrufer dafür verantwortlich den String freizugeben. Memoryleaks wären vorprogrammiert.
Kurt
-
Um unnötiges Kopieren zu vermeiden, einfach
DT_String DT_String::Left(int n) { return DT_String(mpsString.substr(0, n).c_str()); }Statt 'data()' sollte man 'c_str()' verwenden, um einen nullterminierten C-String zu erhalten ('data()' liefert nur den Zeiger auf den Buffer, der nicht unbedingt nullterminert sein muß, sonst mußt du einen Konstruktor (const char *, size_t) verwenden (Aufruf dann mit DT_String(s.data(), s.length()); ).
-
Th schrieb:
Statt 'data()' sollte man 'c_str()' verwenden, um einen nullterminierten C-String zu erhalten
Nein, besser nicht. c_str ist lediglich ein Hintertürchen und nicht für die normale Arbeit mit std::string gedacht.
Th schrieb:
'data()' liefert nur den Zeiger auf den Buffer, der nicht unbedingt nullterminert sein muß
Und wozu sollte Tanzfreak einen nullterminierten Buffer brauchen?