enable_shared_from_this 정리

Program Lang./C++ 2017. 1. 12. 19:02

1. shared_ptr 사용 시 고려사항

말로 기술하기 보다는 아래 예제 코드를 보면서 이해를 하자. shared_ptr 사용 시 주의해야할 내용이며 이를 방지하기 위해서 c++에서는 어떤 기술들이 고려되었는지 고민해 본다.



위의 코드는 shared_ptr의 잘못된 사용 예이다. type이라는 클래스를 하나 동적선언하고 두 개의 shared_ptr ptr1, ptr2에 할당하였다. 이 코드를 실행하면 실행파일이 죽는다. 왜냐하면 ptr2를 실행하는 시점에 ptr1에 의해서 이미 type객체의 파괴자는 호출되어서 객체가 없는 상태인데 ptr2에서 다시 파괴자를 호출하는 구조이다.


[실행결과] http://melpon.org/wandbox/ 에서 실행한 결과이다.



2. shared_ptr 사용 시 다른 고려사항

아래 예제는 http://en.cppreference.com/w/cpp/memory/enable_shared_from_this 의 내용을 내가 이해하기 편하게 수정한 내용이다. 위의 예제는 서로 다른 shared_ptr에 동일한 객체의 포인터를 할당하면 안되는 것을 보여주는 예제이다. 아래 예제는 단순하게 생각했을 때 충분히 있을 수 있는 내용이다.

만약 생성된 현재 객체의 주소를 넘겨서 다른 shared_ptr에서 받아서 처리한다면 어떨까? 아래 예제는 형식은 다르지만 결과적으로 위의 1번 예제와 동일한 문제로 귀결된다.



[실행결과] http://melpon.org/wandbox/ 에서 실행한 결과이다. 결과는 예제 1번 동일하게 실행 파일이 죽는다. 실행 파일이 죽는 이유도 동일하다.



3. enable_shared_from_this 필요성

enable_shared_from_this를 써야 하는 이유는 이제 알 수 있다. cppreference의 내용을 읽어보면 내 수준에서는 마음에 와 닿지 않았다. 아래 예제만 놓고 본다면 현재 객체를 가르키는 share_ptr이외에 추가적으로 현재 객체의 소유권을 갖고자 하는 shared_ptr을 추가하고 할 경우, std::enable_shared_from_this 클래스로부터 상속을 받는다. 이 때 2번 예제처럼 shared_ptr<type>(this)로 넘기기 보다는 enable_shared_from_this의 맴버함수를 통해서 유사한 동작을 수행하지만 shared_ptr의 reference_count를 증가시켜서 넘기는 추가적인 작업을 내부적으로 수행하는 것으로 보인다.

enable_shared_from_this 사용을 통해서 2번 예제의 문제점을 적절하게 수정한 아래 예제를 참조한다. 



[실행결과] http://melpon.org/wandbox/ 에서 실행한 결과이다. 정상적으로 객체가 소멸하는 것을 볼 수 있다.



4. 추가 reference

boost asio http server example 코드에서 enable_shared_from_this의 사용을 찾아볼 수 있다. connection.cpp 파일을 참조하면 사용 보기가 나온다. 


http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp11_examples.html#boost_asio.examples.cpp11_examples.http_server

'Program Lang. > C++' 카테고리의 다른 글

boost asio를 이용한 iptuner 제작  (0) 2017.04.11
message queue implementation by c++ STL  (0) 2017.04.06
[json-c] simple generator json ojbect  (0) 2017.01.09
[json-c] simple parsing example  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
: