2020 이전/C++

이펙티브 C++ 챕터3 자원관리 (1회차)

이상해C++ 2018. 10. 29. 02:20

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