Namensräume
Varianten
Aktionen

std::shared_ptr<T>::use_count

Von cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
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_count null 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_count 1 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) [edit]