[C++11]_[초급][weak ptr의 사용 장면]

장면

  • 약한 참조 특성으로 개체가 없으며 Lock () 호출을 시도할 때까지 지연될 경우에만 임시로 개체를 소유할 수 있습니다.
  • 소유권이 없는 피sharedptr 위탁 관리 대상.
  • lock()만 호출하여 shared 만들기ptr 포인터가 있을 때만 실제 대상을 인용합니다.
  • lock()에서 성공하면 shared 연장ptr 대상의 생명주기입니다. 인용 계수가 증가했기 때문입니다.
  • sharedptr 메인 포인터가 끝난 후 std::weakptr의 lock () 성공 바늘이 존재하고, 이 때 lock () 코드가 호출되며, 인용 계수가 증가합니다.

  • 순환 인용 문제를 해소하는 데 자주 쓰인다.다음 예에서 만과 우먼이 각각 std::shared 를 포함한다면ptr, 그러면 메모리 유출이 발생할 수 있습니다. 왜냐하면 Woman,Main의 계수는 실제적으로 2.Woman 구성원 변수는 Woman의 분석이 호출된 후에만 호출되고, Woman의 분석은 인용 계수가 0일 때만 호출되기 때문에 구성원 변수인 Man은 분석이 없다.예1:std::sharedptr 및 std::weakptr의 용법 및 인용 계수의 순환 인용 문제
  • 주도권을 지연시키는 장면에 사용한다. 예를 들어 라인 A가 중요하고 A가 완성된 후에 B, C라인은 안 해도 된다.이때 B, C는 weakptr 포인터로 제어합니다.

  • 참고 자료


    std::weak_ptr

    예2

    #include <iostream>
    #include <memory>
    
    std::weak_ptr<int> gw;
    
    void f()
    {
        if (auto spt = gw.lock()) { // Has to be copied into a shared_ptr before usage
        std::cout << *spt << "
    "
    ; } else { std::cout << "gw is expired
    "
    ; } } void TestWeakPtrScope_1() { std::cout << "TestWeakPtrScope_1" << std::endl; std::shared_ptr<int> sp1; { auto sp = std::make_shared<int>(42); gw = sp; f(); sp1 = gw.lock(); } f(); } void TestWeakPtrScope_2() { std::cout << "TestWeakPtrScope_2" << std::endl; std::shared_ptr<int> sp1; { auto sp = std::make_shared<int>(42); gw = sp; f(); } f(); } int main() { TestWeakPtrScope_1(); TestWeakPtrScope_2(); }

    출력:
    TestWeakPtrScope_1
    42
    42
    TestWeakPtrScope_2
    42
    gw is expired

    좋은 웹페이지 즐겨찾기