더북(TheBook)

1.6.2.2 shared_ptr<T> 객체를 비교하고 검사하기

shared_ptr<T> 객체에 담긴 주소끼리 비교하거나 nullptr와의 비교는 비교 연산자를 사용하면 된다. 가장 유용한 비교는 상등관계(equality) 여부를 비교하는 것으로 두 포인터가 같은 객체를 가리키는지 여부를 판별한다. 두 shared_ptr<T> 객체 pApB가 같은 타입 T를 가리킨다면 다음과 같은 코드로 상등관계를 비교할 수 있다.

if((pA == pB) && (pA != nullptr))
  std::cout << "두 포인터는 같은 객체를 가리킵니다.\n";

두 포인터 모두 nullptr일 수도 있으므로 두 포인터가 같은 객체를 가리키는지만 비교해서는 충분하지 않다. unique_ptr<T>와 마찬가지로 shared_ptr<T> 객체는 암묵적으로 bool 타입으로 변환될 수 있으므로 다음과 같이 코드를 작성할 수도 있다.

if(pA && (pA == pB))
  std::cout << "두 포인터는 같은 객체를 가리킵니다.\n";

shared_ptr<T> 객체에 복제본이 있는지도 검사할 수 있다.

auto pname = std::make_shared<std::string>("Charles Dickens");
if(pname.unique())
  std::cout << "단 하나만 있습니다..." << std::endl;
else
  std::cout << "두 개 이상 있습니다..." << std::endl;

unique() 함수는 객체의 인스턴스 개수가 1이면 true를 반환하고 그렇지 않으면 false를 반환한다. 인스턴스가 몇 개나 있는지도 알아낼 수 있다.

if(pname.unique())
  std::cout << "단 하나만 있습니다..." << std::endl;
else
  std::cout << "인스턴스는 " << pname.use_count() << " 개입니다." << std::endl;

use_count() 멤버는 호출한 객체의 인스턴스 개수를 반환한다. shared_ptr<T> 객체가 nullptr를 담고 있으면 0을 반환한다.

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