Bietet die C ++ 11-Standardbibliothek ein Dienstprogramm zum Konvertieren von a std::shared_ptr
nach std::unique_ptr
oder umgekehrt? Ist das ein sicherer Betrieb?
shared_ptr
.
Bietet die C ++ 11-Standardbibliothek ein Dienstprogramm zum Konvertieren von a std::shared_ptr
nach std::unique_ptr
oder umgekehrt? Ist das ein sicherer Betrieb?
shared_ptr
.
Antworten:
std::unique_ptr
ist 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_ptr
dafü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_ptr
bieten Fabriken Anrufern den effizientesten intelligenten Zeiger, aber sie hindern Anrufer nicht daran, ihn durch flexiblere Geschwister zu ersetzen.
std::shared_ptr
zustd::unique_ptr
ist 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_ptr
um 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_ptr
zu , std::shared_ptr
aber sie nicht konvertieren kann std::shared_ptr
zu 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_ptr
zu 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)};
Deleter
imunique_ptr