Home [C++] Effective C++ CH3
Post
Cancel

[C++] Effective C++ CH3

자원 관리

자원: 사용을 마치고 난 후엔 시스템에 돌려주어야 하는 모든 것을 말함

  • memory, file descriptor, mutex lock, font, brush

이번 장에서는 객체 기반 방식의 자원 관리를 다룬다.


항목 13

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

RAII 클래스: shared_ptr, unique_ptr, weak_ptr …

자원이 항상 해제되도록 만들 방법은, 자원을 객체에 넣고 그 자원 해제를 소멸자가 맡도록 만드는 것이다.

스마트 포인터로 자원 누출을 막을 수 있다.

이를 사용하는 방법의 중요한 두 가지 특징은 다음과 같다.

  1. 자원을 획득한 후 바로 자원 관리 객체에게 넘긴다.

    • 즉, 스마트 포인터 객체를 초기화 하는데 자원을 사용함.
    • 이는 ‘자원 획득은 초기화(Resource Acquisition Is Initialization: RAII)’라고 불림
  2. 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 한다.

    • 소멸자는 객체가 소멸될 때 자동적으로 호출되기 때문에, 자원 해제가 제대로 이루어지게 되는 것

unique_ptr 은 유일한 소유권을 갖는다고 가정한 객체

shared_ptr은 참조 카운팅 방식 스마트 포인터(reference-counting smart pointer: RCSP)

알아두어야 할 점

  • 스마트 포인터들은 소멸자 내부에서 delete 연산자를 사용함

    • delete []가 아님 (항목 16 참고)
    • 즉, 동적으로 할당한 배열에 대해 이를 사용하면 대략 난감
      • 동적 할당된 배열은 vector 와 string으로 또는 boost::scoped_array, boost::shared_array
  • 함수의 반환 타입이 포인터이면, 문제가 생길 수 있음(항목 18 참고)

    • 호출자 쪽에서 delete 해줘야하기 때문

항목 14

RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정된다. RAII 클래스에 구현하는 일반적인 복사 동작은 복사를 금지하거나 참조 카운팅을 해 주는 선으로 마무리하는 것 (이외의 방법들도 가능)

모든 자원이 힙에 생기지 않음. 이러한 자원들은 자원 관리 클래스를 직접 만들어야 할 필요가 있음

This post is licensed under CC BY 4.0 by the author.

[C++] Effective C++ CH2

게임 서버 프로그래밍 교과서 1장