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과의 비교. 0 . 만약 use_count 가 0을 반환하면, 해당 shared pointer는 비어 있음 이며 객체를 관리하지 않습니다(저장된 포인터가 nullptr 인지 여부와 관계없이).
  • 1과의 비교. 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 객체에 의해서만 관리되는지 확인합니다
(public member function)