delete 쓸 일 없는 C++
지난 몇 달간 모 게임의 서버를 새로 만든다고 다시 C++ 을 한창 썼는데, 그 간의 경험을 정리하는 글을 몇 개 써볼까한다.
우선 delete
쓸 일 없는 C++. 적어도 전통적으로 쓰던 “메모리 해제"의 의미 로 delete
를 쓰는 일은 이제 거의 없는 듯 하다.
메모리를 할당하는 순간 (아주 과격하게 말하면) std::unique_ptr
혹은 std::shared_ptr
중 하나에 저장하면 된다. 선택할 때 판단할 근거도 간단하다.
- 이 메모리를 어느 객체가 가지고 있는지 명확한가 =>
std::unique_ptr
- (반대로) 이 메모리를 여러 객체가 공동 소유해야하는가? =>
std::shared_ptr
std::unique_ptr
는 raw poinetr 대비해서 오버헤드가 없다. 전혀. 그러니 메모리를 할당하면 별 생각 없이 여기에 저장하면 된다.
하지만 프로그램 구조가 복잡하고 누가 이 객체를 소유하는지가 불명확하면 그 경우엔 shared_ptr
를 써야 할 수 있다. 이 경우엔 순환참조가 있을 수 있다면 다시 std::weak_ptr
를 써야하는 경우도 생긴다. (GC가 없으니 순환참조는 해제할 수 없다)
여하튼 이런 원칙으로 프로그램을 작성하면, 기본 생성되는 멤버함수 지울 때 정도 말고는 delete
쓸 일이 없다.
덤: 스마트 포인터의 성능이 중요한 경우 + shared_ptr
를 써야하는 구조라면 선택지는 두 가지:
weak_ptr
도 없어도 된다면boost::intrusive_ptr
- 그게 아니라면
make_shared
를 적극 활용하시라. 대부분의 구현체에서 객체에 할당한 메모리와 참조 카운터에 할당한 메모리가 인접해 있어서 cache friendly 하니 어지간한 케이스는 괜찮다.