rein's world

delete 쓸 일 없는 C++

지난 몇 달간 모 게임의 서버를 새로 만든다고 다시 C++ 을 한창 썼는데, 그 간의 경험을 정리하는 글을 몇 개 써볼까한다.

우선 delete 쓸 일 없는 C++. 적어도 전통적으로 쓰던 “메모리 해제"의 의미delete 를 쓰는 일은 이제 거의 없는 듯 하다. 메모리를 할당하는 순간 (아주 과격하게 말하면) std::unique_ptr 혹은 std::shared_ptr 중 하나에 저장하면 된다. 선택할 때 판단할 근거도 간단하다.

  • 이 메모리를 어느 객체가 가지고 있는지 명확한가 => std::unique_ptr
  • (반대로) 이 메모리를 여러 객체가 공동 소유해야하는가? => std::shared_ptr

std::unique_ptrraw poinetr 대비해서 오버헤드가 없다. 전혀. 그러니 메모리를 할당하면 별 생각 없이 여기에 저장하면 된다. 하지만 프로그램 구조가 복잡하고 누가 이 객체를 소유하는지가 불명확하면 그 경우엔 shared_ptr 를 써야 할 수 있다. 이 경우엔 순환참조가 있을 수 있다면 다시 std::weak_ptr 를 써야하는 경우도 생긴다. (GC가 없으니 순환참조는 해제할 수 없다) 여하튼 이런 원칙으로 프로그램을 작성하면, 기본 생성되는 멤버함수 지울 때 정도 말고는 delete 쓸 일이 없다.

덤: 스마트 포인터의 성능이 중요한 경우 + shared_ptr 를 써야하는 구조라면 선택지는 두 가지:

  • weak_ptr 도 없어도 된다면 boost::intrusive_ptr
  • 그게 아니라면 make_shared 를 적극 활용하시라. 대부분의 구현체에서 객체에 할당한 메모리와 참조 카운터에 할당한 메모리가 인접해 있어서 cache friendly 하니 어지간한 케이스는 괜찮다.