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?
Antwort
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 einemstd:: 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 einerstd::unique_ptr
bieten Fabriken Anrufern den effizientesten Smart Pointer, aber sie hindern Anrufer nicht daran, sie durch flexiblere Geschwister zu ersetzen.
std::shared_ptr
bisstd::unique_ptr
ist nicht erlaubt. Sobald Sie die lebenslange Verwaltung einer Ressource aufstd::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 einestd::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");
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.
Hier ist der "richtige" Weg: 'std :: shared_ptr
Und hier ist der pedantische "richtige" Weg: 'std :: shared_ptr
Definieren Sie bitte "sicheren Betrieb". Nach welcher Art von Sicherheit suchen Sie? Lifetime Management Sicherheit? Fadensicherheit? – jaggedSpire
"STL" bedeutet keine Standardbibliothek. Die STL hat nichts mit 'shared_ptr' zu tun. – curiousguy
@jaggedSpire Thread-Sicherheit würde bedeuten, dass Sie Besitzer in verschiedenen Threads verwendet haben, d. H. Die Verwendungszahl ist nicht 1. – curiousguy