2017-07-26 16 views
3

nach Boost:Umsetzung der Sperre()

auf das Objekt zuzugreifen, kann ein auf ein weak_ptr Shared_ptr umgewandelt werden unter Verwendung des Shared_ptr Konstruktor oder die Elementfunktion zu sperren.

wieder aus boost:

shared_ptr<T> lock() const; 

//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this). 

Soweit ich verstehen, Return shared_ptr<T>(*this) bedeutet eine neue Shared_ptr mit Referenzzählung von 1 zu schaffen; Und das wollen wir definitiv nicht. Also wahrscheinlich verstehe ich es nicht richtig. Wird jemand erklären? Vielen Dank!

Antwort

3

Nein, das ist eigentlich der Punkt von shared_ptr - die kopierte Instanz zeigt auf die gleichen zugrunde liegenden Daten und erhöht den Referenzzähler für beide Instanzen.

Das bedeutet, dass shared_ptr<T>(*this) eine zusätzliche shared_ptr Instanz erstellt, die auf die gleichen Daten verweist, und den Referenzzähler für this und die neue Instanz erhöht.


Es ist tatsächlich komplizierter in dem realen Code, wie die ursprünglichen shared_ptr Daten durch die weak_ptr Instanz zugegriffen werden, aber am Ende effektiv wird die ursprünglichen shared_ptr Daten geteilt (mit der Zählung gemeinsamen Referenz in allen bestehenden erhöht Kopien des jeweiligen shared_ptr Objekts).

+0

Der Code in der Zeile "Returns:" ist jedoch nicht Thread-sicher. Ich vermute, das ist jetzt, wie es * tatsächlich * implementiert wurde (meine Kopie der Standard-Notizen, "atomar ausgeführt"). –

+0

Das bedeutet, dass 'Vorlage explizite shared_ptr (weak_ptr const & r);' wird aufgerufen wird? – Sanich

+0

Ja, technisch die ursprüngliche Shared_ptr Instanz über die weak_ptr zugegriffen wird, aber immer noch die (aktualisiert die Antwort, ganz zu schweigen). – axalis