ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...13
    일지 2022. 6. 13. 07:50

    자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자

    스마트 포인터가 적합하지 않은 경우

    힙에서 관리되는 자원이 아닌 경우에는 스마트 포인터로 처리하는 게 알맞지 않다.

    이 경우 스스로 자원 관리 클래스를 만들어야 할 수 있다.

     

    그 예로 뮤텍스를 관리하는 클래스가 있는 경우 다음과 같이 만들 수 있다.


    class Lock {

    public:

        explicit Lock(Mutex* pm)

            : mutexPtr(pm)

        { lock(mutexPtr); } // 생성자에서 락을 걸고

        ~Lock() { unlock(mutexPtr); } // 소멸자에서 락을 해제한다.

    private:

        Mutex* mutexPtr;

    };


     

    자원 관리 클래스의 복사 처리 방법

    자원 관리 클래스에서 복사가 필요한 경우 자신의 의도에 따라 여러 방식으로 처리할 수 있다.

    • 복사를 금지한다 복사 관련 함수를 private으로 처리해 복사가 되지 않도록 하는 방식이다.
    • 관리하고 있는 자원에 대해 참조 카운팅을 수행한다 shared_ptr처럼 복사마다 카운트를 적용하는 방식이다.
    • 관리하고 있는 자원을 진짜로 복사한다 깊은 복사로 자원을 복사해 두 개의 인스턴스가 되게 만드는 방식이다.
    • 관리하고 있는 자원의 소유권을 옮긴다auto_ptr처럼 복사 시도가 된 경우 복사가 아닌 이동이 되도록 하는 방식이다.

     

    댓글

Designed by Tistory.