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-unqualifiedDeleter타입의 삭제자를 소유한다면(예: 삭제자를 매개변수로 받는 생성자 중 하나로 만들어졌다면), 그 삭제자에 대한 포인터를 돌려줘요. - 그렇지 않으면 널 포인터를 돌려줘요.
매개변수
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!