본문 바로가기
Dev Language/Modern C++ (C++11, 14)

C++ 11 : shared_ptr

by 미티치 2020. 8. 8.
// ConsoleApplication1.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

#include "pch.h"
#include <iostream>

#include <tchar.h>
#include <stdio.h>

#include <memory>

auto main() -> int
{
    using namespace std;

    auto sp1 = shared_ptr<int>{};    // shared_ptr 생성은 하였으나 아직까지는 가리키는 객체가 없음.(nullptr)현재 use_count = 0
    if( sp1)
        cout << "sp1 is initialized! \n" << endl;
    else
        cout << "sp1 is not initialized! \n" << endl;    // 따라서 여기 출력됨 !


    /*
        unique 함수는 내부에서 ,use_count가 1이면 true 리턴해주는 함수이다.
    */
    if( sp1.unique() )
        cout << "sp1 is unique \n" << endl;
    else
        cout << "sp1 is not unique \n" << endl;
    
    cout << "\n=======================================\n" << endl;
    /*
        sp1 에 객체 생성해서 넣어줌. (use count +1). 이제 initialize 되었고 true == unique()
    */
    sp1 = make_shared<int>(1234);
        cout << "sp1 usecount = " << sp1.use_count() << endl;

    cout << "\n=======================================\n" << endl;
    /*
        sp1이 가리키는 객체를 함께 가리키는 sp2 생성.
        shared_ptr 의 operator= 는 내부에서 _swap 함수를 호출하던데, 그럼 _swap 함수에서 참조 카운트+1을 해주겠지?
    */
    auto sp2 = sp1;
    cout << "sp1 usecount = " << sp1.use_count() << endl;
    
    sp2.reset();

    cout << "sp1 usecount = " << sp1.use_count() << endl;


    return 1;
}

 

< 요약 >

  • unique_ptr 이 복사 생성자, 복사 할당자를 delete 함으로써 객체 독점성을 제공했다면

    shared_ptr은 복사 생성자, 복사 할당자를 제공하되 이 함수들이 호출되면 참조 횟수를 +1 함으로써 객체 공유성을 제공한다.

  • unique() 함수는 내부에서 참조 카운트==1이면 true를 반환하는 함수

  • make_shared<> 를 사용해야 한다. make_shared<> 는 객체를 저장할 메모리 공간과 참조 횟수를 유지하는데 필요한 공간을 한번에 할당하기 때문에 속도가 빠르다.