• shared_ptr

    2014. 6. 20.

    by. xxx123

     

     

    참조 카운트 방식의 스마트포인터.

    <memory> 해더를 참조해야 사용가능하다.

     

     

     

    기본 사용법은 다음과 같다.

    shared_ptr<int>  타입을 어려워하지 말자.

    *int 타입인데 smart ptr로 관리되는 녀석이다 라는 의미일 뿐. 그냥 메모리가 할당된 *int형으로 바라보면 된다.

     

     

     

     

     

     

     

     

     

     

    1. 레퍼런스 카운트를 증가시키는 방법.

     

    1. 함수의 인자로 넘기거나 값의 대입으로 인한 복사가 일어나야 한다.

     

    2. 오직 shared_ptr 타입으로 대입이 일어났을 때만 카운트가 증가한다.

     

    3. 레퍼런스로 넘길 경우 카운트가 증가하지 않는다.

     

     

     

     

     

     

     

     

     

     

     

     

     

    2. 레퍼런스 카운트를 감소시키는 방법.

     

    1. 함수의 인자로 넘겨줬다가 해당 함수가 종료될 경우.

     

    2. 값을 넘겨준 객체가 삭제될 경우.

     

    3. 강제로 삭제.

     

     

     

     

     

     

     

     

     

     

    3. Deleter

     

    TR1의  shared_ptr에는 boost처럼 shared_array가 존재하지 않으므로 배열에 대한 삭제 처리가 곤란하다.

    이를 처리할 수 있도록 TR1에서는 Deleter를 제공한다.

     

     

     

     

     

     

     

     

     

    4. 객체 접근 방식

     

    shared_ptr::get()
    : 참조하고 있는 객체의 주소값를 반환한다.
     
    shared_ptr::operator*
    : 참조하고 있는 객체 자체를 반환한다. 즉, *(get())의 의미

    shared_ptr::operator->
    : get()->의 의미가 같다.

     

     

     

     

     

     

     

     

    5. enable_shared_from_this

     

    enable_shared_from_this는 this로 부터 shared_ptr값을 얻고 싶을 경우 사용된다.

    this는 shared_ptr을 인자로 받는 함수에 인자값으로 전달 될수 없다.

    강제로 형변환해서 넘길 수 있겠지만 ref cnt 관련 문제가 발생하게 된다. 

     

    다음 코드를 보자.

     

    TestFunc1()의 std::shared_ptr<Test>(this)가 문제가 된다.

    이렇게 this를 강제 형변환 하여 인자로 넘길 경우 ref cnt가 증가하지 않는다.

    (*단, 한번도 shrared_ptr에 관리 된 적이 없는 포인터의 경우 처음 한번은 ref cnt가 증가.)

     

    그래서 TestFunc2() 함수가 종료 시 ref cnt가 0이 되며 객체가 소멸되게 되고 런타임 에러를 발생시킨다.

     

     

     

     

     

    위과 같이 enable_shared_from_this 클래스를 상속 받고, this->shared_from_this()를 통해

    this를 관리하는 shared_ptr을 얻어 내서 ref cnt를 증가시키는 것이 가능하다.

     

    enable_shared_from_this를 사용하는데는 두 가지 알아둬야 할 내용이 있다.

    1. enable_shared_from_this는 내부적으로  weak_ptr을 이용하고 있다. 즉, enable_shared_from_this의멤버변수로weak_ptr을가지고 있다는 뜻이다.

    고로 class의 사이즈는 8byte(32bit OS 기준)가 추가되게 된다.

     

    2. sahred_from_this() 함수를 호출하기 전까지 최소한 한번은 shared_ptr에 대입되어야 한다. 

    weak_ptr때문이다.

     

     

     

     

    [참고]

    http://sweeper.egloos.com/viewer/2826435

     

     

     

     

     

     

     

    'Programming > C/C++' 카테고리의 다른 글

    Virtual Table (가상함수 테이블)  (0) 2014.12.18
    inline  (0) 2014.12.17
    CreateThread & _beginthreadex  (0) 2014.11.02
    new operator, operator new, placement new  (0) 2014.07.18
    템플릿 템플릿 인자  (0) 2013.09.27

    댓글