Spec-Zone.ru › C++

std::shared_ptr<T>::use_count

long use_count() const noexcept;
(constexpr since C++26)

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

В многопоточной среде use_count атомарно получает количество объектов (типичные реализации используют загрузку memory_order_relaxed).

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

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

Примечания

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

  • Сравнение с 0. Если use_count возвращает 0, указатель совместного владения пуст и не управляет никакими объектами (независимо от того, является ли хранимый указатель nullptr).
  • Сравнение с 1. Если use_count возвращает 1, других владельцев нет. Для этого случая предусмотрена устаревшая(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)

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/shared_ptr/use_count

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API