더북(TheBook)

컨테이너에 스마트 포인터를 저장한다면 자유 공간에서 메모리를 해제하는 걸 걱정하지 않아도 된다. 다음 코드 조각은 문자열을 읽고 vectorshared_ptr<string> 객체를 저장하는 걸 보여준다.

std::cout << “Enter words separated by spaces, enter Ctrl+Z on a separate line to end:\n;
while (true)
{
  if ((std::cin >> word).eof())
  {
    std::cin.clear();
    break;
  }
  words.push_back(std::make_shared<string>(word)); // string에 대한 스마트 포인터를 생성하고 저장
}

스마트 포인터 버전과 원시 버전 사이에 큰 차이는 보이지 않는다. vector 템플릿의 타입 인수는 std::shared_ptr<std::string>이고, push_back() 함수의 인수에서 make_shared()를 호출한다. 즉, 자유 공간에 string 객체를 생성하고 이에 대한 스마트 포인터를 생성한다. make_shared() 함수는 스마트 포인터를 반환한다. 스마트 포인터는 인수 표현식에서 생성되었기 때문에 push_back() 함수는 우측값 참조 매개변수 버전이 호출되고 스마트 포인터는 컨테이너 안으로 이동된다.

템플릿 타입 인수를 입력하는 게 번거로울 수 있다. 이럴 때는 using 지시자를 사용해서 코드를 좀 더 간결하게 할 수 있다.

using PString = std::shared_ptr<std::string>;

이렇게 정의한 다음에는 vector 컨테이너 정의에도 이용할 수 있다.

std::vector<PString> words;
 

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