2016-06-17 4 views
23

Bietet die C++ 11-Standardbibliothek ein Dienstprogramm zur Konvertierung von std::shared_ptr zu std::unique_ptr oder umgekehrt? Ist das eine sichere Operation?Kann C++ 11 unique_ptr und shared_ptr in den jeweils anderen Typ konvertieren?

+0

Definieren Sie bitte "sicheren Betrieb". Nach welcher Art von Sicherheit suchen Sie? Lifetime Management Sicherheit? Fadensicherheit? – jaggedSpire

+0

"STL" bedeutet keine Standardbibliothek. Die STL hat nichts mit 'shared_ptr' zu tun. – curiousguy

+0

@jaggedSpire Thread-Sicherheit würde bedeuten, dass Sie Besitzer in verschiedenen Threads verwendet haben, d. H. Die Verwendungszahl ist nicht 1. – curiousguy

Antwort

36

std::unique_ptr ist die C++ 11 Art und Weise exklusiven Besitz zum Ausdruck bringen, sondern eine seiner attraktivsten Merkmale ist, dass es einfach und effizient zu einem std:: shared_ptr umwandelt.

Dies ist ein wichtiger Teil warum std::unique_ptr ist so gut geeignet als Factory-Funktion Rückgabetyp. Factory-Funktionen können nicht wissen, ob Anrufer eine ausschließliche Eigentumsrechtssemantik für das Objekt verwenden möchten, das sie zurückgeben, oder ob eine gemeinsame Eigentümerschaft (d. H. std::shared_ptr) geeigneter wäre. Durch die Rückgabe einer std::unique_ptr bieten Fabriken Anrufern den effizientesten Smart Pointer, aber sie hindern Anrufer nicht daran, sie durch flexiblere Geschwister zu ersetzen.

std::shared_ptr bis std::unique_ptr ist nicht erlaubt. Sobald Sie die lebenslange Verwaltung einer Ressource auf std::shared_ptr umgestellt haben, können Sie Ihre Meinung nicht ändern. Selbst wenn der Referenzzähler eins ist, können Sie das Eigentum an der Ressource nicht zurückerhalten, um beispielsweise eine std::unique_ptr verwalten zu lassen.

Referenz: Wirksames modernes C++. 42 SPEZIFISCHE WEGE ZUR VERBESSERUNG DER NUTZUNG VON C++ 11 UND C++ 14. Scott Meyers.

Kurz gesagt, können Sie einfach und effizient umwandeln ein std::unique_ptr zu std::shared_ptr aber man kann nicht std::shared_ptr zu std::unique_ptr konvertieren.

Zum Beispiel:

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test"); 
std::shared_ptr<std::string> shared = std::move(unique); 

oder:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test"); 
+5

... Wie machst du es? – Jake

+1

@Jake Ich habe ein Beispiel hinzugefügt – chema989

0

Bei unique_ptr u_ptr erstellen Shared_ptr s_ptr:

std::shared_ptr<whatever> s_ptr(u_ptr.release()); 

in die andere Richtung unpraktisch ist.

+13

Hier ist der "richtige" Weg: 'std :: shared_ptr s_ptr (std :: move (u_ptr));' – emlai

+0

Und hier ist der pedantische "richtige" Weg: 'std :: shared_ptr s_ptr {std :: move (u_ptr)}; ' – polyvertex

Verwandte Themen