[Effective C++] #14 자원 관리 객체 심화
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 14 "자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자"에 해당하는 내용입니다.
자원 관리 객체의 복사
class Lock {
public:
Lock (Mutex* pm)
: mutexPtr(pm)
{lock(mutexPtr);}
~Lock(){unlock(mutexPtr);}
private:
Mutex* mutexPtr;
}
#include<iostream>
using namespace std;
int main() {
Mutex m;
Lock m1(&m);
... // m1 객체의 소멸자 호출 및 자원 해제
}
위 코드는 Mutual Exclusion을 위한 C의 API를 사용한 예제입니다. Lock 클래스는 mutex 포인터의 자원 관리 클래스입니다. Lock의 생성자는 mutex 포인터의 초기화 및 잠금을 실행합니다 Mutual Exclusion이 끝나는 지점에서 mutex 포인터 자원 관리 객체는 소멸자를 호출하고, 해당 객체의 자원을 해제합니다.
Lock m1(&m);
Lock m2(m1); // 자원 관리 객체의 복사 동작
만약 자원 관리 객체가 복사될 때 우리가 고려해야 할점은 무엇이 있을까요?
1. 복사를 금지한다
애초에 Mutal Exclusion을 위한 mutex 포인터에대한 복사 동작은 의미가 없습니다. 블로그의 이전 글에서 다루었던 복사 방지 방법을 토대로, 복사를 막아야 합니다. 아래 링크를 통해 상세한 방법을 확인할 수 있습니다. 간단하게 말해서 복사 함수들을(복사 생성자, 복사 대입 연산자) 기본 클래스의 Private 멤버로 선언하고, Private 상속을 진행합니다.
2. 참조 카운팅, shared_ptr
class Lock {
public:
Lock (Mutex* pm)
: mutexPtr(pm, unlock) // 삭제 지정자 사용!
{
lock(mutexPtr.get());
}
private:
std::tr1::shared_ptr <Mutex> mutexPtr; // shared_ptr 사용
}
#include<iostream>
using namespace std;
int main() {
Mutex m;
Lock m1(&m);
... // m1 객체의 소멸자 호출 및 자원 해제
}
다른 방법으로, 관리하는 자원 객체에 대해 참조 카운팅을 수행하는 방법이 있습니다. 13항목의 자원 관리 객체에서 살펴본 대로, "std::tr1::shared_ptr<Typename T>"는 자원을 참조하는 객체의 개수를 유지 및 관리합니다. 이를 통해, 마지막 객체가 소멸될 때까지 자원을 유지할 수 있습니다. Mutual Exclusion, 즉 동기화 동작을 수행하는 소스코드는 잠금을 해제할 뿐이지, 삭제가 필요하지 않습니다. 따라서, shared_ptr 객체 생성 시, 두 번째 인자로 삭제 지정자 함수를 넣어줍니다. 이 삭제 지정자의 역할은 shared_ptr의 참조 카운팅이 0이 되었을때 호출되는 함수입니다. shared_ptr의 관한 내용은 아래 링크를 참고해주세요!
그 외의 방법들
- 관리하고 있는 자원을 완전 복사하는 방법.
- 관리하고 있는 자원에 대한 소유권을 이전합니다, 즉 auto_ptr의 사용을 통해 오직 1개의 참조자만을 갖습니다.
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #16 new 및 delete 사용 (0) | 2022.01.17 |
---|---|
[Effective C++] #15 자원 관리 객체, 자원에 대한 접근 (0) | 2022.01.15 |
[Effective C++] #13 자원 관리 객체, std::auto_ptr, std::shared_ptr (0) | 2022.01.14 |
[Effective C++] #11 중복 참조와 자기 대입 연산자 (0) | 2022.01.12 |
[Effective C++] #10 대입 연산자와 *this의 참조자 (0) | 2022.01.12 |