-
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처럼 복사 시도가 된 경우 복사가 아닌 이동이 되도록 하는 방식이다.