Probleme mit dem Kopierkonstruktor?

Unicate

Erfahrenes Mitglied
Hallo, alle zusammen!

Ich muss eine eigene Stringklasse schreiben und ich habe das Problem das der Kopierkonstruktor auch aufgerufen wird, jedoch die Daten auch kopiert werden (mit debugger getestet) allerdings nach dem kopieren irgendwie die Daten nicht da sind wo sie sein sollen.

Ein zweites Problem hier ist, das es den fall gibt das der Kopierkonstruktor zwar aufgerufen werden soll, aber er nichts kopieren soll. (siehe zweite Zeile in der main)

also hier die main:
Code:
int main(int argc, char **argv) {
	String str1("original");
	str1 = str1;
	String str2;
	str2 = str1;
	cout << "Original: " << str1 << endl;
	cout << "Kopie: " << str2 << endl;
	return 0;
}
Die Ausgabe dazu sieht so aus:
Code:
Kopiere...
Kopiere...
Original: original
Kopie:

Hier der Konstruktor und der Zuweisungsoperator dazu:
Code:
String::String (const String& other) {
	if(this != &other) {
		cout << "Kopiere..." << endl;
		Len = other.Len;
		pBuf = new char[Len+1];
		strncpy(pBuf, other.pBuf, Len);
	} else {
		cout << "does not need to copy myself" << endl;
	}
}
String& String::operator= (const String& other) {
	String *sNew = new String(other);
	// an dieser stelle ist der String korrekt kopiert (debugger)
	return *sNew;
}

Ich bräuchte mal einen Tip

[Edit:]Letzteres Problem habe ich mit der änderung des operators behoben:
Code:
String& String::operator= (const String& other) {
	if(this != &other) {
		String *sNew = new String(other);
		return *sNew;
	}
	return *this;
}



[Edit 2:]
Sorry, manchmal bin ich ein wenig langsam...
Wieso sollte ich einen neuen String erstellen, wenn ich ihn doch nur zuweisen muss.

Hier mein jetziger Code:
Code:
String& String::operator= (const String& other) {
	if(this != &other) {
		Len = other.Len;
		if(pBuf) {
			delete pBuf;
		}
		pBuf = new char[Len+1];
		strncpy(pBuf, other.pBuf, Len);
	}
	return *this;
}
 
Zuletzt bearbeitet:
Hi.

Noch ein Hinweis: Im Kopierkonstruktor (den du ja in deiner main gar nicht aufrufst), brauchst du keine Prüfung vornehmen ob die 2 Objekte gleich sind, denn es wird ja gerade ein neues Objekt konstruiert welches es vorher nicht gibt, also wird der else Zweig nie aufgerufen werden.

Hinweis 2: du mußt den delete[] Operator verwenden um pBuf freizugeben.

Hinweis 3: statt strncpy könntest du std::copy verwenden (welches dann intern memcpy aufruft), was dann etwas schneller wäre.

Und du müßtest noch sicherstellen das dein String nullterminiert ist (wenn du das überhaupt willst), da strncpy den String nicht unbedingt terminiert.

Gruß
 
Zuletzt bearbeitet:
Mein std Konstruktor setzt pBuf = NULL, deshalb brauch ich den doch nur freigeben, wenn irgendwetwas drinsteht oder?

das strncpy ist eine private member funktion (dadurch weiß ich auch das der string nullterminiert wird). Es wird keine C Bibliothek eingebunden

Aber ich werde mir trotzdem std::copy man ansehen, danke!
 
Zuletzt bearbeitet:
Mein std Konstruktor setzt pBuf = NULL, deshalb brauch ich den doch nur freigeben, wenn irgendwetwas drinsteht oder?
Ja, aber trotzdem mußt du es mit delete[] freigeben und nicht mit delete da du den Speicher mit new[] alloziert hast.

Allerdings prüft der delete/delete[] Operator auch nochmal ob der übergebene Parameter 0 ist, d.h. die Abfrage kannst du dir eigentlich sparen.

Gruß
 
Zurück