Bietet die C ++ 11-Standardbibliothek ein Dienstprogramm zum Konvertieren von a std::shared_ptrnach std::unique_ptroder umgekehrt? Ist das ein sicherer Betrieb?
shared_ptr.
Bietet die C ++ 11-Standardbibliothek ein Dienstprogramm zum Konvertieren von a std::shared_ptrnach std::unique_ptroder umgekehrt? Ist das ein sicherer Betrieb?
shared_ptr.
Antworten:
std::unique_ptrist die C ++ 11-Methode, um exklusives Eigentum auszudrücken. Eine der attraktivsten Funktionen ist jedoch, dass sie einfach und effizient in a konvertiert werden kannstd::shared_ptr.Dies ist ein wesentlicher Grund
std::unique_ptrdafür, warum es als Werksfunktionstyp so gut geeignet ist. Factory-Funktionen können nicht wissen, ob Anrufer die Semantik der exklusiven Eigentümerschaft für das zurückgegebene Objekt verwenden möchten oder ob eine gemeinsame Eigentümerschaft (dhstd::shared_ptr) besser geeignet wäre. Durch die Rückgabe von astd::unique_ptrbieten Fabriken Anrufern den effizientesten intelligenten Zeiger, aber sie hindern Anrufer nicht daran, ihn durch flexiblere Geschwister zu ersetzen.
std::shared_ptrzustd::unique_ptrist nicht erlaubt. Sobald Sie die lebenslange Verwaltung einer Ressource an eine übergeben habenstd::shared_ptr, ändert sich Ihre Meinung nicht mehr. Selbst wenn der Referenzzähler eins ist, können Sie das Eigentum an der Ressource nicht zurückfordern,std::unique_ptrum sie beispielsweise verwalten zu lassen.Referenz: Effektives modernes C ++. 42 SPEZIFISCHE MÖGLICHKEITEN, IHRE VERWENDUNG VON C ++ 11 UND C ++ 14 ZU VERBESSERN. Scott Meyers.
Kurz gesagt, können Sie einfach und konvertieren ein effizienter std::unique_ptrzu , std::shared_ptraber sie nicht konvertieren kann std::shared_ptrzu std::unique_ptr.
Beispielsweise:
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");
std::unique_ptrzu ein std::shared_ptr.
Erstellen Sie mit unique_ptr u_ptr shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
In die andere Richtung zu gehen ist unpraktisch.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleterimunique_ptr