Item 13: 자원 관리는 객체로 처리하자

1. 힙에서 할당 받은 객체는 다시 반납을 해줘야 하는데, STL에서 사용할 수 있는 방법은?
  • std::auto_ptr

  • std::shared_ptr

2. 이 둘의 차이점은?

auto_ptr

  • auto_ptr 자체를 복사하면(복사 생성자 혹은 복사 대입 연산자) 원본 객체는 NULL로 되고, 복사하는 객체만이 그 자원의 소유권을 갖는다.
#include <memory>

std::auto_ptr<Investment> pInv1(createInvestment()); // pInv1이 가리키는 대상은
                                                     // createInvestment()함수가
                                                     // 리턴한 객체

std::auto_ptr<Investment> pInv2(pInv1);              // pInv2는 현재 그 객체를 가리키고
                                                     // 있지만, pInv1은 NULL이다.

pInv1 = pInv2;                                       // 이제 pInv1은 그 객체를 가리키지만,
                                                     // pInv2는 NULL이다.
  • STL 컨테이너들의 원소가 될 수 없다. STL 컨테이너의 경우 원소들이 정상적인 복사 동작으로 구현된다.
  • auto_ptr은 현제 deprecated 되었다. 대신 unique_ptr을 사용해야 한다.

shared_ptr

  • 참조 카운팅 방식으로 동작을 하며, 참조 카운팅이 0이 될 때 가리키는 객체를 반환한다.
  • 일반적인 방식으로 포인터를 다룰 수 있다.
  • STL 컨테이너의 원소로 사용이 가능하다.
3. auto/shared ptr 은 객체를 배열로 잡을 때도 사용 가능한가?

불가능하다. 왜냐 하면 소멸자에서 delete[ ] 연산자가 아니라 delete 연산자를 사용하기 때문이다.

정리

  • 자원 누출을 막기 위해, 생성자 안에서 자원을 확득하고 소멸자에서 그것을 해제하는 RAII 객체를 사용하자
  • 일반적으로 너리 쓰이는 RAII 클래스는 std::shared_ptr 그리고 auto_ptr이다. 이 둘 가운데 shared_ptr이 복사시 직관적이기 때문에 대개 더 좋다. 반면, auto_ptr은 복사되는 객체(원본객체)를 널로 만들어 버린다.

results matching ""

    No results matching ""