C++
shared_from_this()는 생성자 안에서 호출하면 안된다.
RPG만들기XP
2016. 10. 12. 21:30
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을 호출하는 행위이고, 따라서 죽을 수 밖에 없는 것.