[C/C++] weak_ptr

그림자왕국·2020년 9월 17일
0

C++

목록 보기
19/24

개요

weak_ptr은 shared_ptr의 순환참조 문제를 해결하기 위해 등장한 포인터로서
객체를 가리켜도 reference count를 증가시키지 않는다. (대신 weak reference count가 증가됨)
weak count는 객체의 소멸에는 관여하지 않으며, 따라서 weak_ptr은 shared_ptr의 참조자라 봐도 된다. weak_ptr은 객체에 대해 직접 엑세스가 불가능하며, .lock()을 호출하여 shared_ptr로 convert 한 뒤 shared_ptr로 객체에 접근해야 한다.

 shared_ptr<int> sp2 = wp1.lock(); // 그 후 shared_ptr로 인해 reference count가 증가된다.

weak_ptr의 .expired()를 통해 가리킨 객체가 현재 유효한지 확인할 수 있다.

if(wp.expired()) // ref count가 0이면(객체가 소멸됬으면) 1을 반환, 아니면 0을 반환

주요 함수

스마트 포인터의 주요 메서드를 소개하겠다.

.lock() : weak_ptr이 참조하고 있는 shared_ptr의 번지수 '.get()' 를 리턴한다.
.get() : shared_ptr 자신의 포인터를 얻어온다. cout << ptr 와 같은 값을 출력한다.
.reset() : 가르키던 객체를 놔주고 null로 대체한다. ref count가 감소한다.
.expired() : weak_ptr가 만료됬는지 확인한다. (객체가 해제된지 검사)


정리

weak_ptr은 어떤 객체를 참조하되 객체의 수명(ref count)에 영향을 주고 싶지 않은 경우에 사용한다. weak_ptr이 객체를 수정하려면 .lock()을 통해 shared_ptr로 받아 와야지 수정할 수 있다. weak_ptr로 Dangling Pointer의 잠재 위험성을 막을 수 있다.

profile
언리얼 엔진 매니아입니다.

0개의 댓글