std::shared_ptr<T>::use_count
| long use_count() const noexcept; |
||
Gibt die Anzahl der verschiedenen shared_ptr-Instanzen zurück (einschließlich *this), die das aktuelle Objekt verwalten. Wenn kein Objekt verwaltet wird, wird 0 zurückgegeben.
In einer multithreaded Umgebung ruft use_count atomar die Anzahl der Instanzen ab (typische Implementierungen verwenden eine memory_order_relaxed-Ladung).
Inhalt |
[edit] Parameter
(keine)
[edit] Rückgabewert
Die Anzahl der std::shared_ptr-Instanzen, die das aktuelle Objekt verwalten, oder 0, wenn kein Objekt verwaltet wird.
[edit] Hinweise
Häufige Anwendungsfälle sind
- der Vergleich mit 0. Wenn
use_countnull zurückgibt, ist der Shared Pointer *leer* und verwaltet kein Objekt (unabhängig davon, ob sein gespeicherter Zeiger nullptr ist oder nicht). - der Vergleich mit 1. Wenn
use_count1 zurückgibt, gibt es keine anderen Besitzer. Die veraltete(seit C++17) Member-Funktion unique() wird für diesen Anwendungsfall bereitgestellt.
In einer multithreaded Umgebung
Der von use_count zurückgegebene Wert sollte als Annäherung betrachtet werden, da sich die Anzahl der Shared Owner in anderen Threads zwischen der atomaren Abfrage und der sinnvollen Verwendung des Wertes ändern kann. Wenn use_count 1 zurückgibt, bedeutet dies nicht, dass das Objekt sicher modifiziert werden kann, da Zugriffe auf das verwaltete Objekt von früheren Shared Ownern möglicherweise noch nicht abgeschlossen sind und da gleichzeitig neue Shared Owner eingeführt werden können, z. B. durch std::weak_ptr::lock. Nur wenn use_count 0 zurückgibt, ist die Zählung korrekt.
[edit] Beispiel
#include <iostream> #include <memory> void fun(std::shared_ptr<int> sp) { std::cout << "in fun(): sp.use_count() == " << sp.use_count() << " (object @ " << sp << ")\n"; } int main() { auto sp1 = std::make_shared<int>(5); std::cout << "in main(): sp1.use_count() == " << sp1.use_count() << " (object @ " << sp1 << ")\n"; fun(sp1); }
Mögliche Ausgabe
in main(): sp1.use_count() == 1 (object @ 0x20eec30) in fun(): sp.use_count() == 2 (object @ 0x20eec30)
[edit] Siehe auch
| (bis C++20) |
prüft, ob das verwaltete Objekt nur vom aktuellen shared_ptr-Objekt verwaltet wird(public member function) |