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
- 1. Deleter-Typ in unique_ptr vs shared_ptr
- 2. C++ 11 Schließung shared_ptr
- 3. Rückgabe lokale unique_ptr als shared_ptr
- 4. C++ 11 std :: shared_ptr + boost :: serialisierung
- 5. verschieben Besitz von std :: shared_ptr std :: unique_ptr
- 6. C++ 11 decltype: Wie deklariert man den Typ, auf den ein Zeiger zeigt?
- 7. C++ unique_ptr und Arrays
- 8. Warum kann unique_ptr den Typ des Löschers nicht ableiten?
- 9. Was ist der Grund für den Unterschied im Zerstörungsverhalten zwischen std :: unique_ptr und std :: shared_ptr?
- 10. Zeiger auf shared_ptr konvertieren
- 11. leiten Sie den Typ der Tupel-Elemente in C++ 11
- 12. Boost.Pointer Container durch std :: unique_ptr in C++ 11/14 veraltet gemacht?
- 13. Wie Kopieren einen unique_ptr von einem Typ zum anderen Werken
- 14. C++ 11 Smartpointer immer statt neu/löschen?
- 15. C++ 11: GCC 4.8 statische thread_local std :: unique_ptr undefined Referenz
- 16. Wie kann ich den von std :: shared_ptr (unique_ptr) geschützten Speicher ändern?
- 17. intrusive_ptr in C++ 11
- 18. C++ Rule of Zero: polymorphen Löschen und unique_ptr Verhalten
- 19. cs0029 kann den Typ 'Anwendungsbenutzer' nicht implizit in 'Benutzer' konvertieren
- 20. C++ 11-Typ Abzug vs const char *
- 21. Klirren, std :: Rückkehr unique_ptr mit Typ-Umwandlung
- 22. json4s: Konvertieren Sie den Typ in JValue
- 23. C++ unique_ptr Konstantenreferenz
- 24. Karte von Mutex C++ 11
- 25. C++: shared_ptr von abgeleiteten und fangen Shared_ptr der Basis?
- 26. C++ shared_ptr mit C++ zuweisen 11 (std :: shared_ptr): Ist es immer noch schlecht, das shared_ptr in eine temporäre Variable zu initialisieren?
- 27. C++ 11 Auto und size_type
- 28. Kann den Typ 'string' nicht implizit in 'System.Web.UI.WebControls.Unit' konvertieren
- 29. Kann den Typ "unityengine.vector3" nicht in "float" konvertieren
- 30. Kann nicht initialisieren 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