Study/에러 정리

공유포인터 생명주기 확인하기

Juzdalua 2024. 9. 10. 15:18

클라이언트 세션에 플레이어의 정보를 담고있고,

플레이어의 정보에 해당 세션의 정보를 담도록 설계했다.

공유포인터끼리 서로를 참조하여 생명주기를 끊기지 않도록 설계했다.

 

플레이어가 접속 종료 후, 세션의 소멸자가 실행되지 않아 메모리가 줄어들지 않았다.

그래서 공유포인터의 생명주기를 확인하게 되었다.


서로 참조된 데이터가 없어 공유포인터가 소멸될 때.

session = 0xcccccccccccccccc {_player=??? _accountId=??? }

서로 참조된 데이터가 있어 소멸되지 않을 때.

session = shared_ptr {_player=shared_ptr {_playerId=6 _accountId=13 _playerName="a" ...} [1 strong ref] [make_shared] _accountId=...} [5 strong refs, 1 weak ref] [default]

/*
    참조 카운트 정보:
    session 객체에는 5개의 strong refs (강한 참조)가 존재하고, 1개의 weak ref (약한 참조)가 있습니다.
    _player 객체에는 1개의 strong ref가 있습니다.
*/

 

  • session은 shared_ptr 객체로 _player라는 다른 shared_ptr을 가리킨다.
  • _player는 또 다른 객체를 가리키며, 이 객체의 참조 카운트는 1이다.
  • session에는 총 5개의 강한 참조와 1개의 약한 참조가 있다.

 

 

메시지 자체에서는 session과 _player가 서로를 참조하고 있는지 직접적으로 확인할 수는 없지만,

중첩된 shared_ptr 구조와 참조 카운트를 통해 간접적으로 유추할 수 있다.