shared_ptr을 weak_ptr로 변환한 다음 별칭으로 공유_ptrs에 대해서도 올바르게 작동하도록 하려면 별도의 저장된 포인터가 필요합니다. shares_ptr에 잠그지 않고는 weak_ptr에 저장된 포인터에 액세스할 수 없습니다. 다음 코드 예제에서는 weak_ptr이 순환 종속성이 있는 개체를 적절하게 삭제하는 데 사용되는 경우를 보여 주며 있습니다. 예제를 살펴보면 대체 솔루션을 고려한 후에만 만들어졌다고 가정합니다. 컨트롤러 개체는 컴퓨터 프로세스의 일부 측면을 나타내며 독립적으로 작동합니다. 각 컨트롤러는 언제든지 다른 컨트롤러의 상태를 쿼리할 수 있어야 하며, 각 컨트롤러에는 이를 위해 개인 벡터<weak_ptr>가 포함되어 있습니다. 각 벡터에는 순환 참조가 포함되어 있으므로 weak_ptr 인스턴스가 shared_ptr 대신 사용됩니다. weak_ptr은 shared_ptr의 복사본으로 만들어집니다. 하나 이상의 shared_ptr 인스턴스가 소유하지만 참조 계산에 참여하지 않는 개체에 대한 액세스를 제공합니다.

weak_ptr의 존재 또는 파괴는 shared_ptr 또는 다른 복사본에 영향을 주지 않습니다. 경우에 따라 shared_ptr 인스턴스 간의 순환 참조를 끊는 것이 필요합니다. std::weak_ptr 변경 되지 않습니다-std::shared_ptr 반대 – 공유 변수의 참조 카운터입니다. 한 번 보세요. 이것은 참조가 계산되지 않기 때문에 약한 포인터 (weak_ptr)를 사용하는 이유입니다. 따라서 weak_ptr이 선언된 클래스는 소유권이 공유되지 않지만 이러한 개체에 액세스할 수 있습니다. 가장 좋은 디자인은 가능할 때마다 포인터의 공유 소유권을 피하는 것입니다. 그러나 shared_ptr 인스턴스의 공유 소유권이 있어야 하는 경우 인스턴스 간의 순환 참조를 피하십시오.

순환 참조가 불가피하거나 어떤 이유로 더 바람직한 경우 weak_ptr을 사용하여 소유자 중 하나 이상이 다른 shared_ptr에 대한 약한 참조를 제공합니다. weak_ptr을 사용 하 여 기존 관련 인스턴스 집합에 조인 하는 shared_ptr을 만들 수 있지만 기본 메모리 리소스가 여전히 유효한 경우에만 만들 수 있습니다. weak_ptr 자체는 참조 카운트에 참여하지 않으므로 참조 수가 0으로 가는 것을 방지할 수 없습니다. 그러나 weak_ptr을 사용하여 초기화된 shared_ptr의 새 복사본을 가져올 수 있습니다. 메모리가 이미 삭제된 경우 bad_weak_ptr 예외가 throw됩니다. 메모리가 여전히 유효하면 새 공유 포인터는 참조 수를 증가시키고 shared_ptr 변수가 범위에 머무르는 한 메모리가 유효함을 보장합니다. 이러한 예제를 모두 실행할 때 출력을 살펴보겠습니다. 또한 std::weak_ptr은 std::shared_ptr의 원형 참조를 끊는 데 사용됩니다. std:::weak_ptr의 또 다른 용도는 std::shared_ptr에서 관리하는 개체에 의해 형성된 참조 주기를 중단하는 것입니다. 이러한 주기가 분리된 경우(예: 주기에 외부 공유 포인터가 없음) shared_ptr 참조 카운트가 0에 도달할 수 없고 메모리가 유출됩니다. 이를 방지하기 위해 주기의 포인터 중 하나가 약해질 수 있습니다.

Coliru 예제 : 코드를 재생하려는 경우 링크는 다음과 같습니다. std::weak_ptr 모델 임시 소유권: 개체가 있는 경우에만 액세스해야 하고 다른 사람이 언제든지 삭제할 수 있는 경우 std::weak_ptr은 개체를 추적하는 데 사용되며 임시 소유권을 가정하기 위해 std::shared_ptr로 변환됩니다. 원래 std::shared_ptr이 이 때 소멸되면 임시 std::shared_ptr도 소멸될 때까지 개체의 수명이 연장됩니다. std::weak_ptr은 std::shared_ptr에서 관리하는 개체에 대한 비소유(“약한”) 참조를 보유하는 스마트 포인터입니다. 참조된 개체에 액세스하려면 std::shared_ptr로 변환해야 합니다. std::shared_ptr의 순환 참조가 있는 경우 참조 카운터는 0이 되지 않습니다. 따라서 리소스가 자동으로 삭제됩니다. 그러나 이것이 바로 우리가 std::shared_ptr`s를 사용하는 이유입니다.

Scroll Up