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 ;

Devuelve el número de diferentes shared_ptr instancias ( * this incluido) gestionando el objeto actual. Si no hay objeto gestionado, 0 es devuelto.

En un entorno multihilo, use_count recupera atómicamente el número de instancias (las implementaciones típicas utilizan una memory_order_relaxed load).

Contenidos

Parámetros

(ninguno)

Valor de retorno

El número de std::shared_ptr instancias que gestionan el objeto actual o 0 si no hay un objeto gestionado.

Notas

Casos de uso comunes incluyen

  • comparación con 0 . Si use_count retorna cero, el shared pointer está vacío y no gestiona ningún objeto (independientemente de si su puntero almacenado es nullptr ).
  • comparación con 1 . Si use_count retorna 1, no hay otros propietarios. La obsoleta (desde C++17) función miembro unique() se proporciona para este caso de uso. (hasta C++20)

En entorno multihilo

El valor devuelto por use_count debe considerarse aproximado, ya que el número de propietarios compartidos podría cambiar en otros hilos entre la recuperación atómica y el uso significativo del valor. Cuando use_count devuelve 1, no implica que el objeto sea seguro de modificar porque los accesos al objeto gestionado por antiguos propietarios compartidos podrían no haber finalizado, y porque nuevos propietarios compartidos pueden introducirse concurrentemente, como mediante std::weak_ptr::lock . Solo cuando use_count devuelve 0 el conteo es preciso.

Ejemplo

#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);
}

Salida posible:

in main(): sp1.use_count() == 1 (object @ 0x20eec30)
in fun(): sp.use_count() == 2 (object @ 0x20eec30)

Véase también

(until C++20)
verifica si el objeto administrado está gestionado únicamente por el objeto shared_ptr actual
(función miembro pública)