boost::scoped_ptr 를 기억하십니까?

어제 스마트 포인터 관련 글을 썼는데 여기에서 boost::scoped_ptr 는 다루지 않았다. 그건 scoped_ptr 가 반쯤 구현된 unique_ptr 라서. 두 개의 스마트 포인터의 차이는,

  • scoped_ptr 는 지금의 unique_ptr 처럼 오직 1명의 소유자 인 코드를 짤 때 유용하다.
  • unique_ptr 는 move 를 적극적으로 활용해서 만들어진 표준 라이브러리다. (C++11)
  • unique_ptrrelease() 라는 소유권을 포기하는 멤버 함수를 제공한다.

정도다. 그래서 mutable 함수인 release() 만 못쓰게 막으면 되기 때문에 — 즉, const unique_ptr 를 쓰면 되기 때문에, scoped_ptr 의 유용성이 없어진 것. 비슷한 이유로, Google C++ Styleguide도 처음엔 scoped_ptr 좋아요 였다가, C++03 호환성 때문이 아니면 unique_ptr 를 써라 로 바뀌었다.

내 취향으로는 명시적인 release() 멤버 함수가 있다/없다로 구분하는게 더 좋지만 (…), 표준에는 없는 (boost에만 있음) boost::scoped_ptr 를 권하는 건 이젠 어려울 듯…