자원 누출을 막기 위해 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII(Resource Acquisition Is Initialization) 객체를 사용하는 게 좋음
RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII객체의 복사 동작이 결정됨
RAII객체가 복사될 때 이루어져야 할 동작 들 중 하나
1. 복사를 금지
2. 관리하고 있는 자원에 대해 참조 카운팅을 수행(tr1::shared_ptr)
3. 관리하고 있는 자원을 진짜로 복사
4. 관리하고 있는 자원의 소유권을 옮김(auto_ptr)
실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에 RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어줘야 함
자원 접근은 명시적 변환과 암시적 변환으로 가능
안전성만 따지며 명시적 변환이 더 낫지만 고객 편의성을 놓고 보면 암시적 변환이 더 편함
new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 함
마찬가지로 new 표현식에 []를 안 썼으면, 대응되는 delete 표현식에도 []를 쓰지 말아야 함
std::tr1::shared_ptr<Widget> pw(new Widget);
위와 같이 new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들어야 함
두 문장으로 만들 경우 중간에 다른 구문을 수행하다 예외가 발생할 수 있고 이런 이유로 자원 누출이 발생할 수 있음