c ++ Kopiere Konstruktor mit shared_ptr Mitgliedern

9

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 ?:

%Vor%     
Sideshow Bob 24.07.2013, 12:04
quelle

3 Antworten

13

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.

    
cdmh 24.07.2013, 13:04
quelle
6
  

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 der shared_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.

    
Mike Seymour 24.07.2013 13:03
quelle
1

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?

    
Neil Kirk 24.07.2013 12:32
quelle