Debug fehler
-
class String { private: char *buffer; unsigned int len; public: // Konstruktoren String( const char* s="") { len = strlen(s); buffer = new char [len+1]; strcpy( buffer, s ); } // Destruktor ~String() { delete [] buffer; } // Kopier-Konstruktor - explizit nötig da // dynamischer Speicherbereich verwendet wird String( const String& s ) { len = s.len; buffer = new char [len+1]; strcpy( buffer, s.buffer ); } // Zugriffsmethdoe char* get_String() const { return buffer; } // Defintion der Operator-Überladung String operator+=( const String& str1 ) { // tmp gleich mit aktuellen Objekt initialisieren String tmp(*this); // Aktuelles Objekt löschen delete [] buffer; // Gesamtlänge beider Objekte ermitteln len = tmp.len + str1.len; // Speicher reservieren buffer = new char[len]; // linker Operand in buffer kopieren strcpy( buffer, tmp.buffer ); // rechten Operand anhängen strcat( buffer, str1.buffer ); // Zurück und fertig return buffer; } }; int main() { String string1("Adam"); String string2("Eva"); string1+=" und "; string1 += string2; cout << string1.get_String() << "\n"; return 0; }
wenn ich dieses Programm ausführe bekomme ich eine Visual C++ Debug Error meldung.
Woran liegt das?
-
Operator überladung schrieb:
wenn ich dieses Programm ausführe bekomme ich eine Visual C++ Debug Error meldung.
Woran liegt das?Wie wäre es wenn du die Fehlermeldung auch angeben würdest, oder sollen wir ins blaue raten?
-
// Defintion der Operator-Überladung String operator+=( const String& str1 ) { // tmp gleich mit aktuellen Objekt initialisieren String tmp(*this); // Aktuelles Objekt löschen delete [] buffer; // Gesamtlänge beider Objekte ermitteln len = tmp.len + str1.len; // Speicher reservieren buffer = new char[len]; // linker Operand in buffer kopieren strcpy( buffer, tmp.buffer ); // rechten Operand anhängen strcat( buffer, str1.buffer ); // Zurück und fertig return buffer; / }
solltest dieser operator nicht
return *this;
zurückgeben, und eine referenz von this liefern
String &operator+=( const String& str1 )
-
Im operator+= fehlt beim new das +1.
-
Exceptionsicher ist der Operator auch nicht. Wenn
buffer = new char[len];
fehlschlägt verbleibt das Objekt im undefinierten Zustand.
-
Braunstein (off) schrieb:
Exceptionsicher ist der Operator auch nicht. Wenn
buffer = new char[len];
fehlschlägt verbleibt das Objekt im undefinierten Zustand.
Zudem ist es nicht sicher vor Selbstzuweisung (a+=a) - wenn die Exceptionsicherheit hergestellt wird, dürfte dieses Problem allerdings automatisch mitgelöst werden.
Grundregel: gibt niemals Resourcen frei, die noch gebraucht werden könnten oder nicht sicher alias-frei sind.