- 프로그래밍 분야에서 자원(Resource) 이란 ?
사용을 일단 마치고 난 후엔 시스템에 돌려주어야하는 모든 것!
항목 13. 자원 관리에는
객체가 그만!
- 자원 해제를 사용자가 일일이 하다보면 분명 실수 할 수 있다.
■ 자원 관리 방법론
RAII : 자원 관리에 객체를 사용하는 방법 . 자원 획득 후 바로 초기화!
■ 자원 관리 방식
RCSP : 참조 카운팅 방식.
특정한 어떤 자원을 가리키는 외부 객체의 개수를 유지하고있다가 그 개수가 0이되면
자원을 자동으로 삭제하는 스마트 포인터.
■ 자원 관리에 객체를 사용하는 방법
1) 자원을 획득한 후 자원 관리 객체에 넘깁니다.
Investment* createInvestment();
std::tr1::shared_ptr<Investment> pInv1( createInvestment() ); // 생성 후 바로 자원관리 객체로 넘김 |
2) 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 합니다.
■ 제공되는 자원 관리 객체( RAII 클래스 )
1) auto_ptr : 가리키고 있는 대상에 대해 소멸자가 자동으로 delete를 불러주도록 설계!
복사 시 원본 삭제! 이 특성 때문에 일반적으로 사용하기가 힘듬.
표준 라이브러리에 포함
2) shared_ptr : RCSP 방식.
TR1에서 제공.
STL 컨테이너 환경에서 사용하기에 적합.
- 위 auto_ptr, shared_ptr 둘다 동적으로 할당된 배열은 지원 안함 -> vector 및 string으로 대체 해결!!
( 소멸시 delete[]가 아니라 delete 하기 때문! )
- boost의 1) boost::scoped_array 와 2) boost::shared_array는 동적 할당된 배열을 지원함.
■ 책 요약
- 자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII 객체를 사용합시다.
- 일반적으로 널리 쓰이는 RAII 클래스는 tr1::shared_ptr 그리고 auto_ptr 입니다.
이 둘 가운데 tr1::shared_ptr 이 복사 시의 동작이 직관적이기 때문에 대개 더 좋습니다. 반면, auto_ptr은 복사되는
객체( 원본 객체 )를 NULL로 만들어 버립니다.
항목 14. 자원 관리
클래스의 복사 동작에 대해 진지하게 고찰하자
RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정됩니다.
항목 15. 자원 관리
클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자.
실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어 주어야 합니다.
자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능합니다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮습니다.
항목 16. New 및 delete를 사용할 때는 형태를 반드시 갖추자.
new 표현식에 []를 썻으면, 대응되는 delete 표현식에도 []를 써야 합니다. 마찬가지로 new 표현식에 []를 안 썻으면, 대응되는 delete 표현식에도 []를 쓰지 말아야 합니다.
항목 17. New로
생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자
new로 생성한 객체를 스마트 포인터로 넣은 코드는 별도의 한 문장으로 만듭시다. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있습니다.
'비공개' 카테고리의 다른 글
VS2010 코딩시 유의점( 네이밍#1 ) (0) | 2011.07.20 |
---|---|
Google C++ Style Guide (구글 C++ 엔지니어들의 코딩 스타일) (0) | 2011.07.14 |
[ Effective C++ ] Item 2. 생성자, 소멸자 및 대입 연산자 (0) | 2011.07.07 |
[ Effective C++ ] Item 1. C++에 왔으면 C++의 법을 따릅시다 (0) | 2011.07.07 |
[ Effective C++ ] Intro (0) | 2011.07.07 |