Von cplusplus.com :
Selten werden Sie auf eine Klasse stoßen, die keine rohen Zeiger enthält Der Standardkopiekonstruktor ist jedoch nicht ausreichend. Ein Beispiel dafür ist, wenn Sie ein Referenzobjekt haben. boost :: shared_ptr & lt; & gt; ist Beispiel.
Kann jemand das näher ausführen? Wenn wir eine Klasse haben, die ein boost::shared_ptr
enthält, wird diese Kopie nicht erstellt, wenn die Klasse eine Kopie erstellt - und wird daher der shared_ptr
-Konstruktor nicht das Richtige tun und die Referenzzahl erhöhen? Der folgende Code kopiert zum Beispiel Inner
richtig - warum würde das nicht für shared_ptr
funktionieren ?:
Der standardmäßige Kopierkonstruktor verwendet den Kopierkonstruktor für jede Elementvariable oder bitweise für integrierte Typen.
Wenn Sie einen geteilten Zeiger irgendeiner Art verwenden, erhöht der Kopierkonstruktor die gemeinsame Zählung, und sowohl das ursprüngliche als auch das neue Objekt zeigen auf das gleiche Objekt.
In einigen Fällen ist dies das, was Sie wollen; Kopieren des Zeigers und korrekte Verwaltung der Referenzzählung, sodass die Ressource freigegeben werden kann, wenn sie nicht mehr verwendet wird.
Der Kontext des zitierten Artikels besteht darin, ein ganzes Objekt zu kopieren. In diesem Fall würde jedes Objekt eine eigene Kopie seiner Unterobjekte haben und Unterobjekte nicht mit anderen Instanzen teilen. In diesem Fall ist shared_ptr
wahrscheinlich die falsche Wahl und wird die Unterobjekte auf keinen Fall tief kopieren.
Der Absatz ist schlecht formuliert, aber ich bin mir sicher, dass es um Deep-Copy geht, aber dass shared_ptr
diese Deep-Copy nicht liefert. Das stimmt, denn dafür ist es nicht gedacht.
Kann jemand näher darauf eingehen?
Nicht wirklich; Es ist Kauderwelsch.
Wenn wir eine Klasse haben, die ein
boost::shared_ptr
enthält, wird das nicht erstellt, wenn die Klasse eine Kopie erstellt - und wird daher dershared_ptr
-Konstruktor nicht das Richtige tun und die Referenzzahl erhöhen?
Das stimmt. shared_ptr
ist richtig mit einer gültigen Kopiesemantik entworfen, so dass es nicht nötig ist, speziell damit umzugehen, wenn ein Klassenobjekt kopiert wird, das eins enthält.
Möglicherweise meinte der Autor, dass Sie einen Kopierkonstruktor benötigen, um einen neuen zu erstellen, wenn Sie das gemeinsame Objekt kopieren und nicht teilen wollen. Es ist jedoch seltsam, ein shared_ptr
zu verwenden, wenn Sie keine gemeinsame Eigentümerschaft wollen.
Ich denke, es bedeutet, dass die neue Klasse auf die Ressource der alten Klasse verweist, wo Sie erwarten könnten, dass eine Kopie der alten Ressource für die neue Klasse erstellt wird, wie es passieren würde, wenn sie ein vollwertiges Mitglied der Klasse wäre. Entweder ist akzeptabel - es hängt davon ab, was Sie tun.
Wenn Sie beispielsweise einen Hund kopieren und ein Hund einen Knochen hat, erhält der neue Hund seinen eigenen Knochen oder teilt er den ursprünglichen Knochen?
Tags und Links c++ copy-constructor shared-ptr