weak_ptr<T> 객체는 다음과 같이 생성할 수 있다.
auto pData = std::make_shared<X>(); // 타입 X의 객체에 대한 공유 포인터를 생성 std::weak_ptr<X> pwData {pData}; // 공유 포인터에서 약한 포인터 생성 std::weak_ptr<X> pwData2 {pwData}; // 약한 포인터에서 약한 포인터 생성
따라서 weak_ptr<T>는 shared_ptr<T>에서 생성하거나 다른 weak_ptr<T>에서 생성할 수 있다. 약한 포인터(weak pointer)로는 할 수 있는 게 많지 않다. 즉, 약한 포인터가 가리키는 객체는 역참조해서 접근할 수 없다.
• 약한 포인터가 가리키는 객체의 유무만 테스트할 수 있다. 즉, 약한 포인터가 가리키는 shared_ptr<T>가 여전히 거기에 있는지만 확인할 수 있다.
• weak_ptr<T> 객체에서 shared_ptr<T> 객체를 생성할 수 있다.
약한 포인터가 참조하는 객체의 유무를 테스트하는 방법은 다음과 같다.
if(pwData.expired()) std::cout << "객체가 존재하지 않습니다.\n";
pwData 객체의 expired() 함수는 객체가 없으면 true를 반환한다. 약한 포인터에서 공유 포인터를 생성하려면 lock()을 사용한다.
std::shared_ptr<X> pNew {pwData.lock()};
lock() 함수는 객체가 있으면 pNew를 초기화하는 새로운 shared_ptr<X> 객체를 반환하면서 객체를 잠근다.