최근 듣고 있는 강의에서 자신의 shared_ptr을 추출하기 위한 용도로 클래스에 enable_shared_from_this를 선언하는 예시를 보게 되었다. 해당 클래스의 shared_ptr 인스턴스를 안전하게 생성할 수 있는 방법이다. 해당 구문을 통해 상속받아야하며 상속 시 shared_from_this 멤버함수를 통해 인스턴스를 생성할 수 있다. 해당 문법에 대한 레퍼런스는 다음과 같다.
https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
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;
'Language > C++' 카테고리의 다른 글
참조 전달 문법 std::move, std::forward (0) | 2022.01.13 |
---|---|
이동생성자와 보편참조법(universal ref) (0) | 2022.01.07 |
lvalue와 rvalue + 우측값 참조법 (0) | 2021.12.21 |
스마트 포인터 (Smart Pointer) (0) | 2021.12.17 |
[자료형] char 자료형으로 for 반복문을 실행하면 어떻게 될까? (0) | 2021.10.26 |