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 ;

Возвращает количество различных экземпляров shared_ptr (включая * this ), управляющих текущим объектом. Если управляемый объект отсутствует, возвращается 0 .

В многопоточном окружении, use_count атомарно возвращает количество экземпляров (типичные реализации используют memory_order_relaxed загрузку).

Содержание

Параметры

(нет)

Возвращаемое значение

Количество std::shared_ptr экземпляров, управляющих текущим объектом, или 0 если управляемый объект отсутствует.

Примечания

Типичные варианты использования включают

  • сравнение с 0 . Если use_count возвращает ноль, shared pointer является пустым и не управляет никакими объектами (независимо от того, является ли его сохранённый указатель nullptr ).
  • сравнение с 1 . Если use_count возвращает 1, других владельцев нет. Устаревшая (deprecated) (since C++17) функция-член unique() предоставлена для этого случая использования. (until C++20)

В многопоточной среде

Значение, возвращаемое use_count , следует считать приблизительным, так как количество совместных владельцев может изменяться в других потоках между атомарным получением значения и его осмысленным использованием. Когда use_count возвращает 1, это не означает, что объект безопасно изменять, поскольку обращения к управляемому объекту прежними совместными владельцами могут быть не завершены, а также потому, что новые совместные владельцы могут появляться параллельно, например, с помощью std::weak_ptr::lock . Только когда use_count возвращает 0, счетчик является точным.

Пример

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

Возможный вывод:

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

Смотрите также

(until C++20)
проверяет, управляется ли объект только текущим объектом shared_ptr
(публичная функция-член)