본문 바로가기
Language/C++

enable_shared_from_this의 사용법

by W00gie 2022. 1. 4.

최근 듣고 있는 강의에서 자신의 shared_ptr을 추출하기 위한 용도로 클래스에 enable_shared_from_this를 선언하는 예시를 보게 되었다. 해당 클래스의 shared_ptr 인스턴스를 안전하게 생성할 수 있는 방법이다. 해당 구문을 통해 상속받아야하며 상속 시 shared_from_this 멤버함수를 통해 인스턴스를 생성할 수 있다. 해당 문법에 대한 레퍼런스는 다음과 같다. 

 

https://en.cppreference.com/w/cpp/memory/enable_shared_from_this

 

std::enable_shared_from_this - cppreference.com

template< class T > class enable_shared_from_this; (since C++11) std::enable_shared_from_this allows an object t that is currently managed by a std::shared_ptr named pt to safely generate additional std::shared_ptr instances pt1, pt2, ... that all share ow

en.cppreference.com

Member functions

constructs an enable_shared_from_this object
(protected member function)
destroys an enable_shared_from_this object
(protected member function)
returns a reference to this
(protected member function)
returns a shared_ptr which shares ownership of *this
(public member function)
(C++17)
returns the weak_ptr which shares ownership of *this
(public member function)

 

당장 cppreference를 봤을때는 이게 어디에 쓸모있을지 의문일 수 있겠지만 shared_ptr로 관리되는 객체에 대해서 다른 클래스의 멤버함수가 참조하게끔 보낼 때 shared_from_this를 이용하지않고 임의로 다시 shared_ptr을 만들어 보낼 경우 하나의 객체에 두 개의 shared_ptr이 참조하여 shared_ptr내에 reference counting이 정상적으로 작동하지 않는다. 해당 객체가 프로그램이 끝날 때까지 release 되지 않고, 메모리 누수로 이어진다.

 

대표적인 예로 IOCP 모델에서 CP에 IOCP 오브젝트를 보낼 때가 shared_from_this가 필요한 경우이다.

if (_service->GetIocpCore()->Register(shared_from_this()) == false)
		return false;