std:: weak_ptr
|
헤더 파일에 정의됨
<memory>
|
||
|
template
<
class
T
>
class
weak_ptr
;
|
(C++11부터) | |
std::weak_ptr
는
std::shared_ptr
에 의해 관리되는 객체에 대한 비소유("약한") 참조를 보유하는 스마트 포인터입니다. 참조된 객체에 접근하기 위해서는
std::shared_ptr
로 변환되어야 합니다.
std::weak_ptr
는 임시 소유권을 모델링합니다: 객체가 존재할 때만 접근해야 하고, 다른 누군가에 의해 언제든지 삭제될 수 있는 경우,
std::weak_ptr
을 사용하여 객체를 추적하고, 임시 소유권을 획득하기 위해
std::shared_ptr
으로 변환됩니다. 만약 이때 원본
std::shared_ptr
이 소멸되더라도, 객체의 수명은 임시
std::shared_ptr
이 소멸될 때까지 연장됩니다.
std::weak_ptr
의 또 다른 용도는
std::shared_ptr
로 관리되는 객체들에 의해 형성된 참조 순환을 깨는 것입니다. 이러한 순환이 고립되면(즉, 순환 내부로 들어오는 외부 shared pointer가 없는 경우),
shared_ptr
참조 카운트가 0에 도달할 수 없어 메모리 누수가 발생합니다. 이를 방지하기 위해 순환 내부의 포인터 중 하나를
weak로 만들 수 있습니다
.
목차 |
멤버 타입
| 멤버 타입 | 정의 | ||||
element_type
|
|
멤버 함수
새로운
weak_ptr
을 생성함
(public member function) |
|
weak_ptr
을 파괴함
(public member function) |
|
weak_ptr
를 할당함
(public member function) |
|
Modifiers |
|
|
관리되는 객체의 소유권을 해제함
(public member function) |
|
|
관리되는 객체들을 교환함
(public member function) |
|
Observers |
|
객체를 관리하는
shared_ptr
객체들의 수를 반환함
(public member function) |
|
|
참조된 객체가 이미 삭제되었는지 확인함
(public member function) |
|
참조된 객체를 관리하는
shared_ptr
을 생성함
(public member function) |
|
|
weak pointer들의 소유자 기반 순서를 제공함
(public member function) |
|
|
(C++26)
|
weak pointer들의 소유자 기반 해싱을 제공함
(public member function) |
|
(C++26)
|
weak pointer들의 소유자 기반 동등 비교를 제공함
(public member function) |
비멤버 함수
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
헬퍼 클래스
|
(C++20)
|
원자적 약한 포인터
(클래스 템플릿 특수화) |
추론 가이드 (C++17부터)
참고 사항
std::shared_ptr
와 마찬가지로,
weak_ptr
의 일반적인 구현은 두 개의 포인터를 저장합니다:
- 제어 블록에 대한 포인터; 그리고
-
생성된
shared_ptr의 저장된 포인터.
별도로 저장된 포인터는 앨리어싱된
shared_ptr
의 경우에도
shared_ptr
을
weak_ptr
로 변환한 후 다시 되돌리는 작업이 올바르게 작동하도록 보장하기 위해 필요합니다.
weak_ptr
을
shared_ptr
으로 잠그지 않고는 저장된 포인터에 접근하는 것이 불가능합니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_smart_ptr_owner_equality
|
202306L
|
(C++26) |
std::weak_ptr
를
비정렬 연관 컨테이너
에서 키로 사용 가능
|
예제
포인터의 유효성을 보장하기 위해 lock이 어떻게 사용되는지 보여줍니다.
#include <iostream> #include <memory> std::weak_ptr<int> gw; void observe() { std::cout << "gw.use_count() == " << gw.use_count() << "; "; // we have to make a copy of shared pointer before usage: if (std::shared_ptr<int> spt = gw.lock()) std::cout << "*spt == " << *spt << '\n'; else std::cout << "gw is expired\n"; } int main() { { auto sp = std::make_shared<int>(42); gw = sp; observe(); } observe(); }
출력:
gw.use_count() == 1; *spt == 42 gw.use_count() == 0; gw is expired
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3001 | C++17 |
element_type
배열 지원을 위해 업데이트되지 않음
|
업데이트됨 |
참고 항목
|
(C++11)
|
고유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿) |
|
(C++11)
|
공유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿) |