[OOP für Dummies] Fehler bei Referenzzählung
-
Guten Tag!
Ich habe mir gestern "Objektorientierte Programmierung für Dummies" zugelegt
und muss sagen, dass ich wirklich sehr zufrieden damit bin und es nur
weiterempfehlen kannIch bin jedoch auf einen Fehler bei der simplen Stringklasse aus Kapitel 6
gestoßen ("Vorhang auf für die Referenzzählung", S. 117); Ich habe das
Beispiel abgetippt und kompiliert...Speicherzugriffsfehler.
Der Fehler tritt genau dort auf, wo ein String mit einem anderen konstruiert
wird (also per Copykonstruktor):int main() { RCString str1("Hallo "); // ... RCString str3(str1); // <-- hier gibts den segfault // ... }
Bei näherer Betrachtung des Copykonstruktors ist das auch logisch:
RCString::RCString(const RCString& sourceString) { putText(sourceString); }
Ok, es wird einfach die putText() Elementfunktion verwendet, also sehen wir
uns die mal genauer an:void RCString::putText(const RCString& sourceString) { m_pSString->decUseCount(); // Kann nicht funktionieren // ... }
Das Element m_pSString des neuen Strings zeigt ja noch ins Nichts,
deshalb führt es zu einem Speicherzugriffsfehler, wenn man versucht,
über diesen Zeiger eine Elementfunktion aufzurufen.Mein Vorschlag für die Implementierung des Copykonstruktors wäre:
RCString::RCString(const RCString& sourceString) { sourceString.m_pSString->incUseCount(); m_pSString = sourceString.m_pSString; }
gruß,
walker
-
Was sagt denn der Standard dazu? Ein Fehler in der von dir verwendeten Implementation der STL muß doch kein Fehler im Beispiel des Buchs sein...
-
Cocaine schrieb:
Was sagt denn der Standard dazu? Ein Fehler in der von dir verwendeten Implementation der STL muß doch kein Fehler im Beispiel des Buchs sein...
Was soll der Standard bitte zu Marcus' Stringklasse sagen? Ich schätze mal nicht viel mehr als nichts.
Und in welchem Zusammenhang steht die Implementation der STL mit dem hier angesprochenem Problem?