Operator+ überladen



  • Guten Tag,

    das PRG liefert die Fehlermeldung: '_BLOCK_TYPE_IS_VALID(pHeap->nBlockUse)'.

    Der Operator + wird überladen, um zwei Zeichenketten zusammenzufügen.
    Im Konstruktor ist die Welt auch noch in Ordnung (siehe Ausgabe), nur die
    Ausgabe in 'main()' liefert nicht das gewünschte Ergebnis.

    Ich hab keine Ahnung, voran es liegen könnte.

    F1 F1 F1

    Gruss Manu

    #include <iostream>
    #include <cstring>
    #include <sstream>
    #include <new.h>
    
    using namespace std;
    
    class ClZeichenkette
    {
    	// Die Freunde.
    	// Überladen des Ausgabeoperators.
    	friend ostream & operator << (ostream &ausgabe, ClZeichenkette &zk)
    	{
    		ausgabe << zk.chrText;
    		return ausgabe;
    	}
    
    	// Die Member-Variablen.
    	private:
    		char * chrText;
    		unsigned long int intLaenge;
    	// Die Methoden.
    	public:
    		// Der Konstruktor.
    		ClZeichenkette(char * chrTemp = "")
    		{
    			intLaenge = strlen(chrTemp);
    
    			chrText = new char[strlen(chrTemp) + 1];
    			strcpy(chrText, chrTemp);
    
    			// Hier ist die Welt noch i.O.
    			cout << "uebl kon - Text: " << chrText << " Laen: " << intLaenge << " Temp: " << chrTemp << endl;
    		}
    		// Der Destruktor.
    		~ClZeichenkette()
    		{
    			if (chrText)
    				delete [] chrText;
    		}
    		// Überladen des Additionsoperators.
    		ClZeichenkette operator+ (const ClZeichenkette &zk)
    		{
    			char * chrTemp = new char[intLaenge + zk.intLaenge + 1];
    
    			strcpy(chrTemp, chrText);
    			strcat(chrTemp, zk.chrText);
    
    			return ClZeichenkette(chrTemp);
    		}
    };
    
    int main()
    {
    	ClZeichenkette zk1 ="Hallo";
    	ClZeichenkette zk2 = " Welt.";
    	ClZeichenkette zk3;
    
    	zk3 = zk1 + zk2;
    
    	// Hier gibts kein zk3.
    	cout << "'" << zk1 << "' + '" << zk2 << "' = '" << zk3 << "'" << endl;
    
    	// Der Rückgabewert.
    	return 0;
    }
    


  • Du brauchst einen Copy-Konstruktor für deine Klasse. Dein operator+ gibt eine Kopie zurück. Da du aber keinen Copy-Ctor definierst, baut der Compiler selbst einen. Der kopiert aber nur den Zeiger. Wenn das lokale Objekt in deinem operator+ zerstört wird, wird der Zeiger der Kopie ungültig.

    Dein operator+ hat außerdem ein Speicherleck. Den Speicher, den du da holst, musst du auch wieder freigeben.



  • Hallo,
    was fehlt ist ein sinnvoller Copy-Ctor. Außerdem würde ich das Memory-Leak im Op+ entfernen.



  • Hm, mal wieder zu spät 🙄



  • Guten Abend,

    und so viele Fragen.

    Kopierkonstrultor:
    Also einen Konstruktor mit konstantem Referenzparameter auf die Klasse, bitteschön:

    // Der Kopier-Konstruktor.
    ClZeichenkette(const ClZeichenkette &zk)
    {
    	intLaenge = zk.intLaenge;
    	chrText = new char[intLaenge + 1];
    	strcpy(chrText, zk.chrText);
    
    }
    

    geht aber trotzdem nich!?

    Speicherleck:

    Wenn ich 'delete[] chrTemp;' anweise, wie kann ich dann noch 'ClZeichenkette(chrTemp);'
    zurückgeben?

    Gruss Manu



  • Du koenntest z. B. ClZeichenkette im op+ als temp-Variable anlegen. Dann
    loeschst du chrTemp und gibst die temp-Variable zurueck.

    Hmmm...das hoert sich irgendwie unschoen an 😞

    mfg
    v R



  • Guten Abend,

    wenn man noch schnell den operator= überläd, gehts:

    // Überladen des Zuweisungsoperators.
    ClZeichenkette& operator= (const ClZeichenkette &zk)
    {
    	if (this == &zk)
    		return * this;
    
    	intLaenge = zk.intLaenge;
    
    	delete[] chrText;
    	chrText = new char[strlen(zk.chrText) + 1];
    	strcpy(chrText, zk.chrText);
    
    	return * this;
    }
    

    Bleibt die Frage zur Behebung des Speicherlecks.

    Gruss Manu


Anmelden zum Antworten