Пространства имён
Варианты
Действия

std::shared_ptr::use_count

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
 
<tbody> </tbody>
long use_count() const noexcept;

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

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

Параметры

(нет)

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

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

Примечание

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

  • сравнение с 0. Если use_count возвращает ноль, общий указатель является пустым и не управляет никакими объектами (независимо от того, является ли его сохранённый указатель nullptr).
  • сравнение с 1. Если use_count возвращает 1, других владельцев нет. Для этого варианта использования предоставляется устаревшая (начиная с C++17) функция-элемент unique(). (до C++20) В многопоточной среде, это не означает, что объект можно безопасно изменять, поскольку доступ к управляемому объекту бывшими общими владельцами может быть не завершён, а новые общие владельцы могут вводиться одновременно, например std::weak_ptr::lock.

Пример

#include <memory>
#include <iostream>

void fun(std::shared_ptr<int> sp)
{
    std::cout << "в fun(): sp.use_count() == " << sp.use_count()
              << " (объект @ " << sp << ")\n";
}

int main()
{
    auto sp1 = std::make_shared<int>(5);
    std::cout << "в main(): sp1.use_count() == " << sp1.use_count()
              << " (объект @ " << sp1 << ")\n";

    fun(sp1);
}

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

в main(): sp1.use_count() == 1 (объект @ 0x20eec30)
в fun(): sp.use_count() == 2 (объект @ 0x20eec30)

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

(до C++20)
проверяет, управляется ли управляемый объект только текущим экземпляром shared_ptr
(public функция-элемент) [править]