[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "
" 자원 해제를 일일이 하다 보면 언젠가는 잘못을 저지를 수 있다... 안전한 자원관리 방법을 알아두자! "
- 자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII객체를 사용하자!
- 일반 적으로 널리 쓰이는 RAII 클래스는 shared_ptr, auto_ptr이 있다, 두 스마트 포인터의 복사 방식 차이점을 명확히 알고 사용하자!
void Func(void) { CPlayer* pPlayer = CObjectManager::createPlayer(); ... ... ... delete pPlayer; }
- delete에 도달하기 전 return이 있다면...
- delete가 루프안에 있고 break, continue, goto문에 의해 루프에서 빠져 나온다면...
- delete에 도달하기 전 예외가 발생한다면...
코드 블록 혹은 함수로부터 실행제어가 빠져 나올 때 자원을 해제하자!
- 상당수의 자원이 힙에서 동적 할당 되고, 하나의 코드 블록 혹은 함수 안에서만 쓰이는 경우가 많다.
자원 관리에 객체를 사용하는 방법
- 자원을 획득한 후에 자원관리 객체에 넘긴다.
- 자원 획득 즉 초기화(Resource Acquisition Is Initialize : RAII)
- 획득된 자원으로 자원 관리 객체를 초기화 하지 않고 그 자원을 그 객체에 대입하는 경우도 종종 있지만 결은 같음
- 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 한다.
- 소멸자는 어떤 객체가 소멸될 때 자동 호출되기 때문에 실행제어가 어떤 경위로 떠나는지에 관계 없이 자원을 제대로 해제 시킴
포인터와 비슷하게 동작하는 자원 관리용 객체(스마트 포인터)
- 가리키고 있는 대상에 대해 소멸자가 자동으로 delete를 불러주도록 설계
복사 시 원본 객체를 null로 만들어 복사된 객체만이 해당자원의 소유권을 갖음
- auto_ptr은 소멸될 때 자신이 가리키는 대상을 자동으로 delete 시키기 때문에 같은 대상을 가리키지 않아야 함
- STL 컨테이너의 경우 '정상적인' 복사 과정을 가져야 하기 때문에 auto_ptr은 STL 컨테이너의 원소로 사용할 수 없음
참조 카운팅 방식 스마트 포인터(Reference - Counting Smart Pointer : RCSP)의 대표적인 객체
- 자원을 가리키는 외부 객체의 개수를 유지하다가 개수가 0이되면 해당 자원을 삭제
- auto_ptr을 쓰지 못할 때 대안으로 사용하기 아주 좋음
두 객체가 서로를 가리키는, 고리를 이루는 참조상태가 발생하기도 함
STL 컨테이너의 원소로 사용 가능
- 복사가 '정상적' 으로 작동하기 때문에