Namespaces
Variants

std::shared_ptr<T>:: use_count

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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_count null 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_count 1 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)