1 2 3 4 5 6 7 8 9 10 11 12 13 14 | MatchMother::MatchMother(std::weak_ptr<BroadCaster> broadCaster) { // match mother is interested in match request packet // session id -1 means all sessions _broadCaster = broadCaster; if (auto& spt = _broadCaster.lock()) { spt->Subscribe(Subject{ Packets::ID_PACKET_MATCH_REQ,ALL_SESSION }, shared_from_this()); } else { LibLogger::cError << "weak ptr is expired" << std::endl; } } |
위 코드 8번라인에서 자꾸 죽어서 타고 타고 들어가 보았다.
shared_from_this()는 단순히 enable_shared_from_this<T>의 멤버인 _Wptr을 shared_ptr로 캐스팅하여 반환한다.
그런데 enable_shared_from_this<T>의 멤버 _Wptr은 enable_shared_from_this<T>의 생성자에서 셋팅되는 것이 아니라, std::make_shared()에서 셋팅된다.
std::make_shared<MatchMother>()의 내부에서, _Wptr 셋팅이 MatchMother 생성자보다 뒤에서 일어난다.
따라서 생성자 내부에서 shared_from_this()를 호출하는 것은, 아직 셋팅되지 않은 _Wptr을 호출하는 행위이고, 따라서 죽을 수 밖에 없는 것.
'C++' 카테고리의 다른 글
데이터 시리얼라이즈 라이브러리 MsgPack에 대해 정리해 보았다. (0) | 2016.05.16 |
---|---|
C++ 템플릿 사용시 순환참조 문제 (0) | 2016.04.18 |