boost 스마트 포인터 : https://blog.naver.com/sorkelf/40132656978
auto_ptr : https://wikidocs.net/684
스마트 포인터 : https://msdn.microsoft.com/ko-kr/library/hh279674.aspx
c++ 진화 : https://msdn.microsoft.com/ko-kr/library/hh279654.aspx
자원관리
원칙: 메모리를 가져와서 썼으면 반드시 해제 해야한다.
C++가 지원하는 생성자, 소멸자, 객체복사 함수 등을 이용한다.
13. 자원관리에는 객체가 그만
- 자원을 객체에 넣고 그 메모리 해제를 소멸자가 맡도록 한다.
- auto_ptr : 스마트 포인터(가리키는 대상에 대해 소멸자가 자동으로 delete를 불러주도록 설계)
void f() { std:: auto_ptr<Investment> pInv(createInvestment()); }
1) 자원 획득 후 관리 객체에게 넘긴다.
2) 자원관리 객체는 자신의 소멸자를 사용하여 자원이 확실히 해제되도록 한다.
- auto_ptr : 객체에 대한 소유권을 주장한다. 하나의 객체를 가리키는 auto_ptr은 단 하나만 존재. 소유권이 넘어가면 nullptr로 바뀜
이에 대한 대안으로 reference-counting smart pointer(RSCP) 등장. 특정 자원을 가리키는 외부 객체의 개수를 가지고 있다가 그 갯수가 0이되면 해당 자원을 자동으로 삭제한다. JAVA의 가비지 컬렉션과 비슷하나 c++에서는 다른 두 객체가 서로를 가리키고있으면 객체에 대한 메모리를 해제할 수 없다.
std::tr1::shared_ptr<Investment> pInv1(createInvestment());
std::tr1::shared_ptr<Investment> pInv2(pInv1); // 두 포인터가 동시에 한 객체를 가리킴
14. 자원관리 클래스의 복사 동작 고찰
- 세상 모든 자원은 heap에서만 생기지 않는다. ex) Mutex
- mutex관리 경우에서 복사가 될경우 lock은 어떻게 관리할 것인가?
- RAII객체가 복사될 경우
1) 복사를 금지
복사 연산 생성자를 private에다 선언한 클래스를 만들고 그것을 상속받는다. 컴파일러는 복사생성자를 만들지 않는다.
2) 관리하고 있는 자원에 대한 참조 카운팅 수행
shared_ptr은 참조카운트가 0이 되었을때 자원해제를 수행. 대신 삭제자(참조 카운터가 0이되면 호출되는 함수/함수 객체) 지정을 허용한다.
3) 관리하고 있는 자원을 진짜로 복사
deep copy를 수행한다.
4) 관리하고 있는 자원의 소유권을 옮김
auto_ptr의 복사 동작
15. 자원클래스에서 관리하는 자원은 외부에서 접근이 가능하도록 하자
ex)
std::tr1::shared_ptr<Investment> pInv(createInvestment());
int daysHeld(const Investment *pi);
...
int days = daysHeld(pInv); // 컴파일 에러. const Investment *와 shard_ptr 타입이 맞지 않는다.
1) 명시적 변환
int days = daysHeld(pInv.get()); // get()은 스마트 포인터 객체에 들어있는 실제 포인터(의 사본)을 얻을 수 있다
2) 암시적 변환
operator Investment() const { return f; }
명시적 변환은 안정성, 암시적 변환은 고객 편의성
16. new delete 사용시 형태를 맞추자
new [] <-> delete []
new <-> delete
17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 문장
new로 생성한 객체를 스마트 포인터에 넣는 코드는 별도의 한 문장으로 만들어야 한다.
*
1회차 정독끝나고 2회차때 boost 더 알기
'2020 이전 > C++' 카테고리의 다른 글
C++ std::function 콜백 (0) | 2019.02.06 |
---|---|
C++ auto (0) | 2018.11.28 |
이펙티브 C++ Chapter 5 구현 (0) | 2018.11.12 |
이펙티브 C++ 챕터 4 설계 및 선언 (0) | 2018.10.31 |
이펙티브 C++ (0) | 2018.10.28 |