항목 13: 자원 관리에는 객체가 그만!
- 함수 내에서 자원할당 ~ ..코드 사이.. ~ 해제 가 진행 중에 그 사이에서 return, continue등 함수를 빠져 나오는 작업이 발생할 수도 있다.
이러한 경우에 대비해서 생성자에서 자원을 할당하고, 소멸자에서 자원을 해제하도록 하자!
RAII
: Resource Acquisition is Initialization // 자원 획득 즉 초기화
- 자원 획득과 자원 객체의 초기화가 한 문장에서 이루어진다.
auto_ptr<클래스명>p_object(create());
스마트 포인터를 이용하자.
1. auto_ptr
- auto_ptr은 자신이 소멸될때 가리키고 있는 대상에 대해 자동으로 delete를 먹인다.
- 어떤 객체를 두개 이상의 auto_ptr이 가리킨다면 이미 해제된 객체를 또 해제하므로 문제가 생긴다.
- 이러한 불상사를 막기 위해 auto_ptr은 복사생성이나 복사 대입 발생 시 원본 객체는 null로 만든다. 소유권을 이전하는 것이다.
이러한 특징으로 인해 auto_ptr을 사용하는 것은 최선이 아니다.
소유권을 잃는 특징을 모르고, 원본을 참조하면 null값을 참조하게 되므로 최선이 아니다.
2. shared_ptr
- 참조카운팅 방식인 shared_ptr을 사용하자.
- 외부 객체의 개수를 유지하다가 그 개수가 0이 되면 해당 자원을 자동으로 삭제한다.
위에서 동일한 객체를 가리키는 두개의 shared_ptr이 잇다면 참조개수 2개에서 포인터들이 소멸되면서 갯수가 0이 되면 그때서야 가리키는 객체를 소멸시킨다는 소리이다.
- 가비지 컬렉션과 유사
3. 알아야 할점
- auto_ptr과 shared_ptr은 소멸자 내부에서 delete 연산자를 사용하지만,
동적할당된 배열을 delete [] 하지는 못한다.
항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자.
- 동적으로 할당받은 객체를 복사하게 된다면 얕은복사 문제가 생긴다.
1. 복사를 금지한다.
1) private에다가 복사 생성자를 명시
2) 복사 방지 코드 작성
class Lock : private Uncopyable{
}
2. 관리하고 있는 자원에 참조 카운팅을 수행한다.