'2016/10'에 해당되는 글 1건

  1. 2016.10.12 shared_from_this()는 생성자 안에서 호출하면 안된다.
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을 호출하는 행위이고, 따라서 죽을 수 밖에 없는 것.

Posted by RPG만들기XP
,