더북(TheBook)

1.6.2 shared_ptr<T> 객체 사용하기

shared_ptr<T> 객체는 다음과 같이 정의할 수 있다.

std::shared_ptr pdata {new double{999.0}};

공유 포인터를 역참조해서 가리키는 대상에 접근하거나 주소에 저장된 값을 바꿀 수 있다.

*pdata = 8888.0;
std::cout << *pdata << std::endl;        // 8888.0
*pdata = 8889.0;
std::cout << *pdata << std::endl;        // 8889.0

pdata를 정의하면 두 가지 할당을 한다. 하나는 double 변수를 위해 힙 메모리를 할당하는 것이고, 다른 하나는 스마트 포인터의 복제본 개수를 기록하는 데 사용하는 컨트롤 블록을 위해 스마트 포인터 객체와 관련된 힙 메모리를 할당하는 것이다. 힙 메모리 할당은 처리 시간이 비싼 작업이다. memory 헤더에 정의된 make_shared<T>() 함수를 사용해서 shared_ptr<T> 타입의 스마트 포인터를 생성하면 이를 더 효율적으로 할 수 있다.

auto pdata = std::make_shared<double>(999.0); // 생성된 객체는 double 변수를 가리킨다

자유 공간에 생성되는 변수의 타입은 <> 사이에 지정한다. 함수 이름 다음에 () 사이에 있는 인수는 생성한 double 변수를 초기화할 때 사용된다. 일반적으로 make_shared<T>() 함수에 인수는 얼마든지 쓸 수 있고, 실제 인수의 개수는 생성하는 객체의 타입에 따라 정해진다. make_shared<T>를 사용해 자유 공간에 객체를 생성할 때 T 생성자에 필요한 인수가 두 개 이상이라면 콤마(,)로 구분해서 쓰면 된다. auto 키워드는 make_shared<T>()가 반환한 객체에서 pdata의 타입을 자동으로 추론하므로 pdata의 타입은 shared_ptr<double>로 정해진다. 하지만 잊지 말아라. auto로 지정한 타입이 std::initializer_list로 추론될 수 있으므로 타입을 auto로 지정할 때 초기화 목록을 쓰면 안 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.