본문 바로가기

RAII3

항목 15 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자 우리가 auto_ptr이나 shared_ptr을 보면 이 스마트 포인터가 관리하는 자원에 외부에서 접근 할 수 있도록 설계 되어있다. std::shared_ptr test(new Test()); test.get(); // Test* 를 반환 test->memberFunction(); // ->로 자원에 접근하여 멤버 함수 호출 가능 (*test).memberFuncion(); // *로 자원에 접근한 후 멤버 함수 호출 가능 자, 그렇다면 우리가 항목 14에서 배운대로 직접 자원관리 클래스를 만들때에도 이러한 점을 고려하는 것이 좋다. 예를 들어 C API에서 글자를 출력하기 위해 제공하는 FontHandle이라는 자원을 관리하는 Font클래스를 직접 만든다고 생각해 보자. FontHandle getFo.. 2024. 1. 19.
항목 14 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 자 우리는 항목 13에서 RAII 기법을 이용해 힙 영역의 자원을 관리하는 방법에 대해 배웠다. 이 예로 우리는 auto_ptr과 shared_ptr에 대해서 배웠는데 경우에 따라서는 우리가 직접 자원 관리 클래스를 만들어야 하는 경우도 생긴다. 아래 예시를 한 번 보자. Mutex 타입의 뮤텍스 객체를 조작하는 C API를 사용하고 있다고 가정하자. 이 C API가 제공하는 함수 중에는 뮤텍스를 잠그는 lock 및 잠금을 푸는 unlock 함수가 있다. void lock(Mutex* pm); void unlock(Mutex* pm); 그런데 나는 여기서 뮤텍스의 잠금을 자동으로 관리해주는 클래스를 하나 만들고 싶다. 그래서 생성시에 자원을 획득하고 소멸시에 자원을 해제하도록 다음과 같이 설계했다. cl.. 2024. 1. 19.
항목 13 자원 관리에는 객체가 그만! 항목 12는 복사 생성자를 만들때 파생 객체의 복사 생성자에서 부모 클래스의 복사 생성자를 호출하여 빠짐없이 복사하자는 내용이었는데 크게 다룰 내용이 없어서 건너 뛰었다. 이번 항목은 자원관리에 객체를 사용하자는 내용인데 우선 아래 코드를 통해 몇가지 가정을 하도록 하자. class Investment { ... }; // 대충 투자 관련 처리를 담당하는 기본 클래스 Investment* createInvestment(); // Investment클래스에서 파생된 객체를 동적할당하여 포인터를 반환하는 팩토리 함수 자 그리고 이 클래스와 함수를 아래 코드처럼 사용한다고 치자. void f() { Investment* pInv = createInvestment(); // 팩토리 함수 호출 ... // pIn.. 2024. 1. 19.