Namespaces
Variants

std::experimental::shared_ptr<T>:: shared_ptr

From cppreference.net
**참고:** C++ 코드 내의 템플릿 선언과 키워드(template, class, shared_ptr, noexcept 등)는 번역하지 않고 원문을 유지했습니다. HTML 태그와 속성도 그대로 보존되었습니다.
constexpr shared_ptr ( ) noexcept ;
(1)
constexpr shared_ptr ( std:: nullptr_t ) noexcept ;
(2)
template < class Y >
explicit shared_ptr ( Y * ptr ) ;
(3)
template < class Y, class Deleter >
shared_ptr ( Y * ptr, Deleter d ) ;
(4)
template < class Deleter >
shared_ptr ( std:: nullptr_t ptr, Deleter d ) ;
(5)
template < class Y, class Deleter, class Alloc >
shared_ptr ( Y * ptr, Deleter d, Alloc alloc ) ;
(6)
template < class Deleter, class Alloc >
shared_ptr ( std:: nullptr_t ptr, Deleter d, Alloc alloc ) ;
(7)
template < class Y >
shared_ptr ( const shared_ptr < Y > & r, element_type * ptr ) noexcept ;
(8)
shared_ptr ( const shared_ptr & r ) noexcept ;
(9)
template < class Y >
shared_ptr ( const shared_ptr < Y > & r ) noexcept ;
(9)
shared_ptr ( shared_ptr && r ) noexcept ;
(10)
template < class Y >
shared_ptr ( shared_ptr < Y > && r ) noexcept ;
(10)
template < class Y >
explicit shared_ptr ( const std:: weak_ptr < Y > & r ) ;
(11)
template < class Y >
shared_ptr ( std:: auto_ptr < Y > && r ) ;
(12)
template < class Y, class Deleter >
shared_ptr ( std:: unique_ptr < Y,Deleter > && r ) ;
(13)

다양한 포인터 타입으로부터 관리할 객체를 참조하는 shared_ptr 을 생성합니다.

아래 설명의 목적상, 포인터 타입 Y* 가 포인터 타입 T* 와 호환된다고 말하는 것은 Y* T* 로 변환 가능하거나, Y 가 배열 타입 U[N] 이고 T U cv [] (여기서 cv는 일부 cv-qualifiers 집합)인 경우를 말합니다.

1,2) 관리되는 객체가 없는 shared_ptr 을 생성합니다. 즉, 빈 shared_ptr 입니다.
3-7) ptr 을 관리 객체에 대한 포인터로 사용하여 shared_ptr 을 생성합니다. 만약 T 가 배열 타입 U[N] 인 경우, Y(*)[N] T* 로 변환 가능해야 합니다. 만약 T 가 배열 타입 U[] 인 경우, Y(*)[] T* 로 변환 가능해야 합니다. 그렇지 않은 경우, Y* T* 로 변환 가능해야 합니다. 추가적으로:
3) delete-expression 을 사용합니다( delete ptr , T 가 배열 타입이 아닌 경우; delete [ ] ptr , T 가 배열 타입인 경우). 이를 삭제자로 사용합니다. Y 는 완전한 타입이어야 합니다. 해당 delete 표현식은 올바르게 형성되어야 하며, 잘 정의된 동작을 가져야 하고 어떤 예외도 던지지 않아야 합니다.
4,5) 지정된 삭제자 d 를 삭제자로 사용합니다. d ( ptr ) 표현식은 올바르게 형성되어야 하며, 잘 정의된 동작을 가지며 어떤 예외도 던지지 않아야 합니다. Deleter CopyConstructible 여야 하며, 복사 생성자와 소멸자는 예외를 던지지 않아야 합니다.
6,7) (4,5) 와 동일하지만, 내부 사용을 위한 데이터 할당에 alloc 의 사본을 추가적으로 사용합니다. Alloc Allocator 여야 하며, 해당 복사 생성자와 소멸자는 예외를 던지지 않아야 합니다.
8) 별칭 생성자 : shared_ptr 와 소유권 정보를 공유하지만, 관련 없고 관리되지 않는 포인터 ptr 를 보유하는 shared_ptr 을 생성합니다. 이 shared_ptr 이 그룹에서 마지막으로 스코프를 벗어나더라도, 원래 r 에 의해 관리되던 객체의 소멸자를 호출합니다. 그러나 이 shared_ptr 에서 get() 을 호출하면 항상 ptr 의 복사본을 반환합니다. 프로그래머는 이 ptr 이 해당 shared_ptr이 존재하는 동안 유효하게 유지되도록 보장할 책임이 있으며, 이는 일반적인 사용 사례에서 ptr r 에 의해 관리되는 객체의 멤버이거나 r. get ( ) 의 별칭(예: 다운캐스트)인 경우에 해당합니다.
9) r 가 관리하는 객체의 소유권을 공유하는 shared_ptr 을 생성합니다. r 가 객체를 관리하지 않으면, * this 도 객체를 관리하지 않습니다. 템플릿 오버로드는 Y* T* 호환되지 않을 경우 오버로드 결정에 참여하지 않습니다.
10) shared_ptr r 에서 이동 생성합니다. 생성 후, * this r 의 이전 상태 사본을 포함하며, r 는 비어 있습니다. 템플릿 오버로드는 Y* T* 호환되지 않는 경우 오버로드 결정에 참여하지 않습니다.
11) r 가 관리하는 객체의 소유권을 공유하는 shared_ptr 을 생성합니다. Y* T* 와 호환 가능해야 합니다 . 참고로 동일한 목적으로 r. lock ( ) 를 사용할 수 있습니다: 차이점은 이 생성자는 인자가 비어 있을 경우 예외를 발생시키지만, weak_ptr < T > :: lock ( ) 는 그 경우 빈 shared_ptr 을 생성한다는 점입니다.
12) 이전에 r 이 소유하던 객체를 저장하고 소유하는 shared_ptr 을 생성합니다. Y* T* 로 변환 가능해야 합니다. 생성 후에는 r 이 비어 있게 됩니다.
13) r 가 현재 관리하는 객체를 관리하는 shared_ptr 을 생성합니다. r 와 연관된 삭제자는 관리 객체의 향후 삭제를 위해 저장됩니다. r 는 이 호출 이후 어떤 객체도 관리하지 않습니다. 이 오버로드는 Y* T* 호환되지 않는 경우 오버로드 해결에 참여하지 않습니다.
D 가 참조 타입인 경우, 다음 코드와 동등합니다: shared_ptr ( r. release ( ) , std:: ref ( r. get_deleter ( ) ) . 그렇지 않은 경우, 다음 코드와 동등합니다: shared_ptr ( r. release ( ) , r. get_deleter ( ) ) .

목차

참고 사항

파생된 타입의 객체에 대한 원시 포인터로부터 shared_ptr 을 생성할 때, std::experimental::enable_shared_from_this 에서 파생된 경우, shared_ptr 의 생성자들은 std::experimental::enable_shared_from_this 베이스의 비공개 weak_ptr 멤버를 갱신하여, 향후 shared_from_this() 호출이 이 원시 포인터 생성자에 의해 생성된 shared_ptr 와 소유권을 공유하도록 합니다.

원시 포인터 오버로드는 가리키는 객체의 소유권을 가정하므로, 이미 shared_ptr 에 의해 관리되는 객체에 대해 원시 포인터 오버로드를 사용하여 shared_ptr 을 생성하는 것은 객체가 std::experimental::enable_shared_from_this 에서 파생된 타입인 경우에도 정의되지 않은 동작을 초래할 수 있습니다.

매개변수

ptr - 관리할 객체에 대한 포인터
d - 객체를 파괴하는 데 사용할 삭제자
alloc - 내부 사용을 위한 데이터 할당에 사용할 할당자
r - 소유권을 공유하거나 소유권을 획득할 다른 스마트 포인터

예외

3) std::bad_alloc 필요한 추가 메모리를 확보할 수 없는 경우. 다른 오류에 대해서는 구현에서 정의된 예외를 던질 수 있습니다. 예외가 발생하는 경우 해당하는 delete-expression ( delete ptr 만약 T 가 배열 타입이 아닌 경우, delete [ ] ptr 그 외의 경우)이 호출됩니다.
4-7) std::bad_alloc 필요한 추가 메모리를 확보할 수 없는 경우. 다른 오류에 대해 구현에서 정의된 예외를 던질 수 있습니다. d ( ptr ) 예외가 발생한 경우 호출됩니다.
11) std::bad_weak_ptr 만약 r. expired ( ) == true . 이 경우 생성자는 아무런 효과가 없습니다.
12) std::bad_alloc 필요한 추가 메모리를 확보할 수 없는 경우. 다른 오류에 대해서는 구현에서 정의된 예외를 던질 수 있습니다. 예외가 발생하면 이 생성자는 아무런 효과를 가지지 않습니다.
13) 예외가 발생하면 생성자는 아무런 효과를 가지지 않습니다.

예제

참고 항목

새로운 객체를 관리하는 shared pointer를 생성합니다
(함수 템플릿)
할당자를 사용하여 할당된 새로운 객체를 관리하는 shared pointer를 생성합니다
(함수 템플릿)