memory_weak_ptr

memory_weak_ptr (std::weak_ptr)

<memory> 헤더에 정의되어 있어요. std::shared_ptr이 관리하는 객체에 대한 비소유("약한") 참조를 보유하는 스마트 포인터예요. 참조된 객체에 접근하려면 std::shared_ptr로 변환해야 해요. C++11부터 도입됐어요.

출처: cppreference

본문

template< class T > class weak_ptr;

(C++11부터)

std::weak_ptrstd::shared_ptr이 관리하는 객체에 대한 비소유("약한") 참조를 보유하는 스마트 포인터예요. 참조된 객체에 접근하려면 std::shared_ptr로 변환해야 해요.

std::weak_ptr은 **임시 소유권(temporary ownership)**을 모델링해요. 객체가 접근되어야 할 때만 lock()으로 shared_ptr을 얻고, 객체가 여전히 존재하는지 확인하며 접근해요. 구체적으로 다음 상황에서 유용해요.

  • 객체가 여전히 존재하는지 확인하지 않고는 안전하게 접근할 수 없는 경우: lock()은 객체가 파괴되었으면 빈 shared_ptr을 돌려줘요.
  • 순환 참조를 끊어야 하는 경우: shared_ptr 간의 순환 참조는 메모리 누수를 일으키는데, 그 중 한 쪽을 weak_ptr로 두면 해결돼요.

표현형적으로, weak_ptr은 공유 소유권을 관찰하지만 그것을 유지하지는 않아요.

멤버 함수

  • (생성자): 새 weak_ptr 생성
  • (소멸자): weak_ptr 파괴
  • operator=: weak_ptr 대입
  • reset: 관리 객체 참조 해제
  • swap: 두 weak_ptr 교환
  • use_count: 관리 객체를 참조하는 shared_ptr 수 반환
  • expired: 관리 객체가 이미 삭제되었는지
  • lock: 관리 객체에 대한 shared_ptr 생성(만료되면 빈 것)
  • owner_before: 소유자 기반 순서 제공

예제

#include <iostream>
#include <memory>

std::weak_ptr<int> gw;

void observe()
{
    std::cout << "use_count == " << gw.use_count() << ": ";
    if (auto spt = gw.lock())
        std::cout << "*spt == " << *spt << '\n';
    else
        std::cout << "gw has expired\n";
}

int main()
{
    {
        auto sp = std::make_shared<int>(42);
        gw = sp;
        observe();
    }
    observe();   // sp 가 범위를 벗어나 gw 는 만료됨
}

출력:

use_count == 1: *spt == 42
use_count == 0: gw has expired

더 알아보기 (Learn more)

cppreference