std::shared_ptr
definiert in Header <memory> | ||
template<class T >class shared_ptr; | (seit C++11) | |
std::shared_ptr
ist ein intelligenter Zeiger (smart pointer), der ein Objekt über einen Zeiger besitzt. Mehrere shared_ptr
Instanzen können das selbe Objekt besitzen. Das Objekt wird zerstört, wenn eines der folgenden Ereignisse eintritt:
- Der letzte
shared_ptr
, der das Objekt besitzt, wird zerstört.
- Dem letzten
shared_ptr
, der das Objekt besitzt, wird ein neues Objekt mittles operator= oder reset() zugewiesen.
Das Objekt wird entweder mittels einer delete-expression oder einem benutzerdefiniertem deleter zerstört, der dem shared_ptr
während der Erzeugung übergeben wird.
Ein shared_ptr
kann den Besitz eines Objektes teilen, auch wenn ein anderes Objekt in ihm gespeichert ist. Das kann dazu benutzt werden, um Zeiger auf Member-Objekte zu speichern, während der shared_ptr
das Objekt besitzt, zu dem das Member-Objekt gehört.
Ein shared_ptr
kann auch kein Objekt besitzen, in diesem Fall wird er leer genannt.
Der shared_ptr
erfüllt die Bedingungen für CopyConstructible
und CopyAssignable
.
Inhaltsverzeichnis |
[Bearbeiten] Klassentypen
Typ | Definition |
element_type | T |
[Bearbeiten] Methoden
erzeugt einen neuen shared_ptr (öffentliche Elementfunktion) | |
zerstört das Objekt, das dem shared_ptr gehört, wenn keine anderen shared_ptr mehr auf das Objekt verweisen. (öffentliche Elementfunktion) | |
Zuweisung eines shared_ptr (öffentliche Elementfunktion) | |
modifizierend | |
ersetzt das verwaltete Objekt Original: replaces the managed object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (öffentliche Elementfunktion) | |
tauscht die verwalteten Objekte aus (öffentliche Elementfunktion) | |
informierend | |
liefert einen Zeiger auf das verwaltete Objekt (öffentliche Elementfunktion) | |
dereferenziert den Zeiger auf das verwaltete Objekt (öffentliche Elementfunktion) | |
gibt die Anzahl der shared_ptr -Objekte zurück, die auf dasselbe verwaltete Objekt verweisen (öffentliche Elementfunktion) | |
prüft, ob das verwaltete Objekt nur durch die aktuelle shared_ptr Instanz verwaltet wird (öffentliche Elementfunktion) | |
prüft, ob der shared_ptr mit einem verwalteten Objekt verknüpft ist (öffentliche Elementfunktion) | |
erlaubt Sortierung der shared_ptr basierend auf dem Besitz (öffentliche Elementfunktion) |
[Bearbeiten] Assoziierte Funktionen
erzeugt einen shared_ptr , der ein neues Objekt verwaltet (Funktions-Template) | |
erzeugt einen shared_ptr , der ein neues Objekt verwaltet, das mittels eines Allokators erzeugt wird. (Funktions-Template) | |
führt ein static_cast, ein dynamic_cast oder ein const_cast auf den Typ des verwalteten Objekts durch (Funktions-Template) | |
gibt einen Zeiger auf das Löschobjekt des verteilten Zeigers zurück, falls dieses eines besitzt. (Funktions-Template) | |
vergleicht mit einem anderen shared_ptr oder mit nullptr(Funktions-Template) | |
schreibt den Wert des verwalteten Zeigers in einen output stream (Funktions-Template) | |
(C++11) | Spezialisierung des std::swap-Algorithmus für verteilte Zeiger (Funktions-Template) |
spezialisiert atomare Operationen für verteilte Zeiger (Funktions-Template) |
[Bearbeiten] Hilfsklassen
(C++11) | Hash-Unterstützung für std::shared_ptr (class Template-Spezialisierung) |
[Bearbeiten] Hinweise zur Implementierung
In einer typischen Implementierung hält ein std::shared_ptr nur zwei Zeiger:
- einen Zeiger auf das referenzierte Objekt
- einen Zeiger auf einen Steuerblock
wobei der Steuerblock ein dynamisch erzeugtes Objekt ist. Der Steuerblock enthält:
- einen Zeiger auf das verwaltete Objekt oder das verwaltete Objekt selbst
- den deleter
- den allocator
- die Anzahl der
shared_ptr
, die das verwaltete Objekt besitzen - die Anzahl der
weak_ptr
, die auf das verwaltete Objekt verweisen
Wenn ein shared_ptr
mittels std::make_shared oder std::allocate_shared erzeugt wird enthält der Steuerblock das verwaltete Objekt selbst als eine member-Variable. Wenn ein shared_ptr
durch Aufruf eines Konstruktors erzeugt wird, wird ein Zeiger im Steuerblock gespeichert.
Der Zeiger, der im shared_ptr
direkt gespeichert ist, wird von get()
zurückgegeben, während der Zeiger/das Objekt, das im Steuerblock gespeichert ist, dasjenige ist, welches gelöscht wird, wenn die Anzahl der gemeinsamen Besitzer Null erreicht. Die beiden Zeiger sind nicht notwendigerweise identisch.
Der Destruktor von shared_ptr
verringert die Anzahl der gemeinsam Besitzer im Steuerblock. Wenn diese Anzahl Null erreicht, ruft der Steuerblock den Destruktor des verwalteten Objekts auf, löscht sich jedoch nicht selbst, bevor nicht die Anzahl der std::weak_ptr ebenfalls Null erreicht.