Google C++ Style Guide
4. Google-Specific Magic
구글이 C++ 코드를 보다 견고하게 만드는 트릭과 유틸리티와 다른 곳에서 보던 코드와는 다른 구글만의 C++코드를 보여준다.
포인터를 사용해야 한다면, boost::scoped_ptr를 사용한다. 객체가 STL 컨테이너를 담는 경우처럼 특정 조건 하에서는 std::tr1::shared_ptr 만을 사용해야 한다. 절대 auto_ptr을 사용하면 안된다.
‘스마트’ 포인터는 포인터처럼 동작하는 ‘객체’이다. 따라서 메모리를 스스로 관리한다. 예를 들어scopted_ptr이 파괴될 때 포인터가 가리키는 객체를 소멸시킨다. shared_ptr도 마찬가지이지만, 참조 카운팅 방식 스마트 포인터로 참조 카운터가 0이 되면 객체를 삭제한다.
일반적으로 객체의 소유권(ownership)을 분명하게 코드를 설계해야 한다. 가장 명확한 객체 소유권은 포인터를 전혀 사용하지 않고 객체를 직접 필드나 지역 변수로써 사용하는 것이다. 다른 극단적인 방법은 참조 카운트 포인터를 아무도 소유하지 않는 것이다.
참조 카운팅 포인터 설계의 문제는 원형 참조나 객체가 절대 삭제되지 않는 이상한 조건을 만들기 쉽다. 또한 값이 복사되거나 할당될 때마다 atomic operation을 수행하기 위해서 느리다.
(*atomic opration : operation의 집합이 결합하여 하나의 operation으로 표시되어 결과가 성공이나 실패의 형태로 나타나는 Operation)
추천하지는 않지만, 참조 카운팅 스마트 포인터는 때로 가장 간단하며, 우아하게 문제를 해결할 수 있는 방법이다.
스타일 에러를 검출하기 위해 cpplint.py를 사용한다.
Cpplint.py는 소스 파일을 읽고 스타일 에러를 찾아주는 툴이다. 완벽하진 않으며, 에러 메시지가틀리다거나(false positive), 에러를 검출 못하기도 하지만(false negative) 꽤 유용한 툴이다.
False positive는 라인 끝에 //NOLINT를 추가하여 무시할 수 있다.