프로그래밍/의문

std::shared_ptr shared_from_this 잘못된 사용

제페 2015. 8. 7. 09:55
반응형

문제의 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
LobbyServer(size_t poolSize, unsigned short port)
{
  sessionPool.reserve(poolSize);
 
  for (auto i = 0; i < poolSize; ++i)
  {
    auto sharedThis = shared_from_this(); // error!
 
    auto newSession = std::make_shared<TcpSession>(port, sharedThis);
 
    sessionPool.emplace_back(newSession); // n개의 세션 풀을 만듦
  }
}
cs


뭐가 문제일까. shared_from_this()를 하는데 오류가 발생하지? // 7번 라인

LobbyServer 인스턴스를 shared_ptr로 생성 했는데?

이유는 생성자에서 shared_from_this를 호출한 데에 있었다.

저 초기화 코드 부분을 별도의 함수로 떼어내자 정상적으로 동작했다.


enable_shared_from_this 를 상속하고 shared_from_this를 사용하려는데 내부적으로 가지는 weak_ptr 인스턴스가 초기화 되기도 전에 shared_from_this를 호출해서 bad_weak_ptr 오류가 발생했던 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
void LobbyServer::Start(size_t poolSize, unsigned short port)
{
  sessionPool.reserve(poolSize);
 
  for (auto i = 0; i < poolSize; ++i)
  {
    auto sharedThis = shared_from_this();
 
    auto newSession = std::make_shared<TcpSession>(port, sharedThis);
 
    sessionPool.emplace_back(newSession); // n개의 세션 풀을 만듦
  }
}
cs


음,., 덕분에 enable_shared_from의 동작 방식을 조금 더 이해할 수 있었다. 

반응형