비공개2011. 7. 7. 16:28

- 프로그래밍 분야에서 자원(Resource) 이란 ?
사용을 일단 마치고 난 후엔 시스템에 돌려주어야하는 모든 것!


항목 13. 자원 관리에는 객체가 그만!
 


 - 자원 해제를 사용자가 일일이 하다보면 분명 실수 할 수 있다.
 


 ■ 자원 관리 방법론
 

 RAII    : 자원 관리에 객체를 사용하는 방법 . 자원 획득 후 바로 초기화!




 ■ 자원 관리 방식

 RCSP  : 참조 카운팅 방식.
              특정한 어떤 자원을 가리키는 외부 객체의 개수를 유지하고있다가 그 개수가 0이되면
              자원을 자동으로 삭제하는 스마트 포인터.


 

 ■ 자원 관리에 객체를 사용하는 방법
 

 1) 자원을 획득한 후 자원 관리 객체에 넘깁니다.
 

1
2
3
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로 생성한 객체를 스마트 포인터로 넣은 코드는 별도의 한 문장으로 만듭시다. 이것이 안 되어 있으면, 예외가 발생될  때 디버깅하기 힘든 자원 누출이 초래될 수 있습니다. 



 

Posted by 닭꽝