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_ptr은 std::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