자원 관리는 객체가 그만(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
반응형
'프로그래밍 > Effective C++' 카테고리의 다른 글
자원관리 클래스의 자원은 접근 가능하게(effective c++ 15) (0) | 2015.08.20 |
---|---|
자원관리 클래스의 복사 동작에 대해(effective c++ 14) (0) | 2015.08.12 |
템플릿으로 만들어진 기본 클래스 접근하기(effective c++ 43) (0) | 2015.08.07 |
자기대입 처리(effective c++ 11) (0) | 2015.08.07 |
대입 연산자 *this 반환(effective c++ 10) (0) | 2015.08.07 |
객체 생성과 소멸에 가상함수 호출하지 않기(effective c++ 09) (0) | 2015.08.02 |
소멸자와 예외처리(effective c++ 08) (0) | 2015.08.02 |