일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- c++
- more effective c++
- reference
- 영화
- resource management class
- 스마트 포인터
- 게임
- 예외
- 반복자
- 참조자
- 메타테이블
- 오블완
- operator new
- 비교 함수 객체
- Effective c++
- 티스토리챌린지
- lua
- exception
- 언리얼
- Smart Pointer
- 루아
- virtual function
- 영화 리뷰
- implicit conversion
- 다형성
- UE4
- 상속
- effective stl
- Vector
- 암시적 변환
Archives
- Today
- Total
스토리텔링 개발자
[Effective C++] 14. 자원 관리 클래스 복사 동작 본문
728x90
항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자.
커스텀 자원 관리 클래스
- 자원 관리 클래스를 직접 만들 필요성을 느낄 때가 있다.
- 힙에 생기지 않는 자원은 기존 스마트 포인터로 관리하는 데 맞지 않다.
커스텀 자원 관리 클래스의 복사 동작
- RAII 법칙(생성시 자원 획득, 소멸시 자원 해제)을 따르는 클래스의 복사 동작
- 복사를 금지한다.
- RAII 객체의 복사 자체가 말이 안되는 경우가 많다.
- 뮤텍스 잠금의 경우 복사될 필요성 자체가 없다.
- 복사되면 안되는 RAII 클래스는 반드시 복사 함수를 막아야 한다.
- Uncopyable을 사용하여 복사를 막는다.(항목 6 참조)
-
class Lock : private Uncopyable // 항목 6 참고 { public: ... };
- RAII 객체의 복사 자체가 말이 안되는 경우가 많다.
- 관리하고 있는 자원에 대해 참조 카운팅을 수행한다.
- 데이터 멤버로 shared_ptr을 넣으면 쉽게 해결할 수 있다.
- 문제점
- shared_ptr의 소멸자 기본 동작은 가리키는 대상을 '삭제'하도록 되어 있다.
- 하지만 원하는 바가 삭제가 아닐 수 있다.
- 뮤텍스 잠금의 경우 unlock만 하고 싶을 것이다.
- 해결
- shared_ptr는 삭제자(deleter) 지정을 허용한다.
- 두번째 매개변수로 삭제자를 지정할 수 있다.
- auto_ptr은 지원하지 않는 기능..
- 비정적 데이터 멤버의 소멸자(shared_ptr의 소멸자)는 자동으로 호출된다.
- 그러므로 클래스 내에 직접 소멸자를 만들어줄 필요는 없다.
- shared_ptr는 삭제자(deleter) 지정을 허용한다.
-
class Lock { public: explicit Lock(Mutext *pm) : mutextPtr(pm, unlock) // unlock 함수를 삭제자로 사용한다. { lock(mutextPtr.get()); } private: std::tr1::shared_ptr<Mutex> mutexPtr; };
- 관리하고 있는 자원을 진짜로 복사한다
- 깊은 복사를 수행해야 한다.
- string 타입은 복사 시 깊은 복사를 수행한다.
- 복사 시 사본은 포인터 및 그 포인터가 가리키는 새로운 힙 메모리를 가지게 된다.
- 관리하고 있는 자원의 소유권을 옮긴다
- 그 자원을 실제로 참조하는 RAII 객체는 딱 하나만 존재하도록 한다.
- auto_ptr의 복사 동작이 바로 이 방식이다.
- 객체 복사 함수는 컴파일러에 의해 자동 생성되므로 필요시 직접 만들 수밖에 없다.
728x90
'개발 > Effective C++' 카테고리의 다른 글
[Effective C++] 16. new, delete 짝 맞춤 문제 (0) | 2024.06.07 |
---|---|
[Effective C++] 15. 자원 관리 클래스 get 함수 제공하기 (0) | 2024.06.05 |
[Effective C++] 13. 자원 관리 객체(RAII) (0) | 2024.06.03 |
[Effective C++] 12. 복사 함수 구현 (0) | 2024.05.31 |
[Effective C++] 11. operator= 자기 대입 문제 (0) | 2024.05.30 |
Comments