[Effective C++] Ch3. 자원 관리

y30n9ju1v·2021년 6월 19일
0

프로그래밍

목록 보기
5/18

Item 13. 자원 관리에는 객체가 그만!

자원 누출을 막기 위해 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII(Resource Acquisition Is Initialization) 객체를 사용하는 게 좋음

Item 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자

RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII객체의 복사 동작이 결정됨
RAII객체가 복사될 때 이루어져야 할 동작 들 중 하나

1. 복사를 금지
2. 관리하고 있는 자원에 대해 참조 카운팅을 수행(tr1::shared_ptr)
3. 관리하고 있는 자원을 진짜로 복사
4. 관리하고 있는 자원의 소유권을 옮김(auto_ptr)

Item 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자

실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에 RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어줘야 함
자원 접근은 명시적 변환과 암시적 변환으로 가능
안전성만 따지며 명시적 변환이 더 낫지만 고객 편의성을 놓고 보면 암시적 변환이 더 편함

Item 16. new 및 delete를 사용할 때는 형태를 반드시 맞추자

new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 함
마찬가지로 new 표현식에 []를 안 썼으면, 대응되는 delete 표현식에도 []를 쓰지 말아야 함

Item 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자

std::tr1::shared_ptr<Widget> pw(new Widget);

위와 같이 new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들어야 함
두 문장으로 만들 경우 중간에 다른 구문을 수행하다 예외가 발생할 수 있고 이런 이유로 자원 누출이 발생할 수 있음

0개의 댓글