std::shared_ptr<T>:: use_count
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
(C++17)
|
||||
|
shared_ptr::use_count
|
||||
|
(
until C++20*
)
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
|
(until C++20)
(until C++20)
(until C++20)
(until C++20)
(until C++20)
(C++20)
|
||||
|
functions
(
until C++26*
)
|
||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
long
use_count
(
)
const
noexcept
;
|
||
Gibt die Anzahl der verschiedenen
shared_ptr
Instanzen zurück (
*
this
eingeschlossen), die das aktuelle Objekt verwalten. Wenn es kein verwaltetes Objekt gibt, wird
0
zurückgegeben.
In einer Multithread-Umgebung ruft use_count atomar die Anzahl der Instanzen ab (typische Implementierungen verwenden einen memory_order_relaxed Load).
Inhaltsverzeichnis |
Parameter
(keine)
Rückgabewert
Die Anzahl der std::shared_ptr Instanzen, die das aktuelle Objekt verwalten, oder 0 falls kein verwaltetes Objekt vorhanden ist.
Hinweise
Häufige Anwendungsfälle umfassen
-
Vergleich mit
0
. Wenn
use_countnull zurückgibt, ist der Shared Pointer leer und verwaltet keine Objekte (unabhängig davon, ob der gespeicherte Zeiger nullptr ist). -
Vergleich mit
1
. Wenn
use_count1 zurückgibt, gibt es keine weiteren Besitzer. Die veraltete (seit C++17) Member-Funktion unique() wird für diesen Anwendungsfall bereitgestellt. (bis C++20)
In einer Multithread-Umgebung
Der von
use_count
zurückgegebene Wert sollte als Näherungswert betrachtet werden, da sich die Anzahl der gemeinsamen Eigentümer in anderen Threads zwischen der atomaren Abfrage und der sinnvollen Verwendung des Werts ändern kann. Wenn
use_count
1 zurückgibt, bedeutet dies nicht, dass das Objekt sicher zu modifizieren ist, weil Zugriffe auf das verwaltete Objekt durch frühere gemeinsame Eigentümer möglicherweise noch nicht abgeschlossen sind und weil neue gemeinsame Eigentümer parallel eingeführt werden können, wie z.B. durch
std::weak_ptr::lock
. Nur wenn
use_count
0 zurückgibt, ist die Zählung genau.
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)
Siehe auch
|
(until C++20)
|
prüft, ob das verwaltete Objekt nur vom aktuellen
shared_ptr
-Objekt verwaltet wird
(öffentliche Elementfunktion) |