std::shared_ptr::use_count
Материал из cppreference.com
<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 функция-элемент) |