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.


  • Mod

    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.


Log in to reply