shared_ptr_get_deleter

shared_ptr_get_deleter (std::get_deleter)

<memory> 헤더에 정의되어 있어요. p의 삭제자(deleter)에 접근해요. C++11부터 도입됐어요.

출처: cppreference

본문

template< class Deleter, class T >
Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept;

(C++11부터, constexpr since C++26)

p의 삭제자에 접근해요.

  • 공유 포인터 p가 cv-unqualified Deleter 타입의 삭제자를 소유한다면(예: 삭제자를 매개변수로 받는 생성자 중 하나로 만들어졌다면), 그 삭제자에 대한 포인터를 돌려줘요.
  • 그렇지 않으면 널 포인터를 돌려줘요.

매개변수

  • p: 삭제자에 접근해야 하는 공유 포인터

반환값

소유한 삭제자에 대한 포인터 또는 nullptr. 반환된 포인터는 적어도 그것을 소유하는 shared_ptr 인스턴스가 하나 남아 있는 동안 유효해요.

주의 (Notes)

반환된 포인터는 예를 들어 std::weak_ptr이 남아 있고 구현이 제어 블록 전체가 파괴될 때까지 삭제자를 파괴하지 않는다면, 마지막 shared_ptr보다 오래 살 수 있어요.

예제

std::shared_ptr의 삭제자는 shared_ptr의 타입과 독립적이라는 점을 보여줘요.

#include <iostream>
#include <memory>

struct Foo { int i; };
void foo_deleter(Foo* p)
{
    std::cout << "foo_deleter called!\n";
    delete p;
}

int main()
{
    std::shared_ptr<int> aptr;
    {
        auto foo_p = new Foo;
        std::shared_ptr<Foo> r(foo_p, foo_deleter);
        aptr = std::shared_ptr<int>(r, &r->i); // aliasing 생성자
        // aptr 은 int 를 가리키지만 전체 Foo 를 관리
    } // r 파괴 (삭제자 호출 안됨)

    if (auto del_p = std::get_deleter<void(*)(Foo*)>(aptr))
    {
        std::cout << "shared_ptr<int> owns a deleter\n";
        if (*del_p == foo_deleter)
            std::cout << "...and it equals &foo_deleter\n";
    }
    else
        std::cout << "The deleter of shared_ptr<int> is null!\n";
} // 여기서 삭제자 호출

출력:

shared_ptr<int> owns a deleter
...and it equals &foo_deleter
foo_deleter called!

더 알아보기 (Learn more)

cppreference