자원 관리는 객체가 그만(effective c++ 13)

2015. 8. 7. 01:35프로그래밍/Effective C++

728x90
728x90

결론

자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII 객체를 사용하자.


일반적으로 널리 쓰이는 RAII 클래스는 tr1::shared_ptr 그리고 auto_ptr이지만 tr1::shared_ptr이 

복사 시의 동작이 직관적이기 때문에 더 좋다.


객체 사용
특징
자원을 획득한 후에 자원 관리 객체에 넘긴다.
- 자원 획득 및 초기화( Resource Acquisition Is Initialization: RAII )
자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 한다.
- 소멸자는 어떤 객체가 소멸될 때 자동적으로 호출되기 때문에, 자원 해제가 제대로 이루어진다.

목적
자원 해제를 일일이 하다 보면 실수할 가능성이 있다.
delete 문을 건너 뛰게 되면 객체를 담고 있는 메모리가 누출되고, 그 객체가 가지고 있던 자원까지 모두 누수가 생긴다.
객체를 통해 소멸자가 자동으로 delete를 불러주도록 설계하여 누수를 제거한다.

스마트 포인터
auto_ptr
객체를 복사하면서 원본 객체는 null로 만든다.
복사하는 객체만이 그 자원의 유일한 소유권을 갖는다고 가정한다.
STL 컨테이너의 경우 원소들이 ‘정상적인’ 복사 동작을 가져야 하기 때문에 원소로 허용하지 않는다.

shared_ptr
참조 카운팅 방식 스마트 포인터(reference-counting smart pointer: RCSP )
외부 객체의 개수를 유지하고 있다가 그 개수가 0이 되면 해당 자원을 자동으로 삭제한다.
가비지 컬렉션(garbage collection)의 행동과 비슷하지만 circula reference의 경우를 없애지 못한다.
복사 동작이 ‘예상대로’ 이루어지기 때문에 STL 컨테이너 등의 환경에 맞게 쓸 수 있다.

특징
소멸자 내부에서 delete가 호출된다. ( delete[] 가 아니다 )


728x90
반응형