Namespaces
Variants

std:: weak_ptr

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더 파일에 정의됨 <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

T

(C++17 이전)

std:: remove_extent_t < T >

(C++17 이후)

멤버 함수

새로운 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)
weak pointer들의 소유자 기반 동등 비교를 제공함
(public member function)

비멤버 함수

std::swap 알고리즘을 특수화함
(함수 템플릿)

헬퍼 클래스

원자적 약한 포인터
(클래스 템플릿 특수화)

추론 가이드 (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)
공유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿)