C ++ 11 unique_ptr 및 shared_ptr이 서로의 유형으로 변환 할 수 있습니까?


99

C ++ 11 표준 라이브러리는 a std::shared_ptr에서 std::unique_ptr로 또는 그 반대로 변환 할 수있는 유틸리티를 제공 합니까? 이것이 안전한 작업입니까?


"안전한 작동"을 정의하십시오. 어떤 종류의 안전을 찾고 있습니까? 평생 관리 안전? 스레드 안전성?
jaggedSpire

2
"STL"은 표준 라이브러리를 의미하지 않습니다. STL은 shared_ptr.
curiousguy dec.

1
@jaggedSpire 스레드 안전 당신이 다른 스레드에 사용되는 소유자를 의미, 즉 사용 횟수는 1되지 않습니다
curiousguy

@curiousguy 나는 그것을 알고 있었다. 내 요점은 OP의 질문에 "안전"이 잘 정의되어 있지 않았고, 여러 종류가 있기 때문에 어떤 종류의 "안전"을 의미하는지 명확히해야했습니다.
jaggedSpire dec.

답변:


161

std::unique_ptr독점 소유권을 표현하는 C ++ 11 방식이지만 가장 매력적인 기능 중 하나는 쉽고 효율적으로 std::shared_ptr.

이것이 std::unique_ptr팩토리 함수 리턴 유형으로 적합한 이유의 핵심 부분입니다 . 팩토리 함수는 호출자가 반환하는 객체에 대해 배타적 소유권 의미 체계를 사용 하려는지 또는 공유 소유권 (예 :) std::shared_ptr이 더 적절한 지 여부를 알 수 없습니다 . 를 반환함으로써 std::unique_ptr팩토리는 호출자에게 가장 효율적인 스마트 포인터를 제공하지만 호출자가 더 유연한 형제로 대체하는 것을 방해하지 않습니다.

std::shared_ptr에가 std::unique_ptr허용되지 않습니다. 리소스의 평생 관리를으로 전환하면 std::shared_ptr마음이 바뀌지 않습니다. 참조 횟수가 1이더라도 리소스를 관리하기 위해 리소스 소유권을 되 찾을 수 없습니다 std::unique_ptr.

참조 : 효과적인 최신 C ++. 42 C ++ 11 및 C ++ 14 사용을 개선하는 구체적인 방법. 스콧 마이어스.

즉, 당신은 쉽고 효율적으로 변환 할 수 있습니다 std::unique_ptrstd::shared_ptr하지만 당신은 변환 할 수 없습니다 std::shared_ptrstd::unique_ptr.

예를 들면 :

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);

또는:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");

9
... 어떻게합니까?
Jake

4
나는 예를 들어 추가 한 @Jake
chema989

허용되지 않는 동안 컴파일러 (적어도 gcc는 아님)는 실수로 (예 : 멤버 변수의 포인터 유형을 변경하여) a 를에 할당하는 경우 실제로 방지 (또는 경고) 하지 않습니다 . std::unique_ptrstd::shared_ptr
StefanQ

-8

unique_ptr u_ptr이 주어지면 shared_ptr s_ptr을 만듭니다.

std::shared_ptr<whatever> s_ptr(u_ptr.release());

다른 길로가는 것은 비현실적입니다.


29
여기에 "오른쪽"방법이있다 :std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
emlai

6
그리고 여기에 현학적 인 "올바른"방법이 있습니다.std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
polyvertex

3
덜 안전한 것은 무엇입니까?
nmr

7
@VioletGiraffe • 나는 polyvertex가 새로운 초기화 목록 구문 (자동 축소 변환을 피하고 균일 한 구문으로 멤버 초기화를 수용)을 사용하는 것을 옹호한다고 생각합니다. 6 개 중 6 개, 다른 6 개?
Eljay

8
@nmr 그것은 당신이 Deleter내부에 저장을 잃을 수 있기 때문에 안전하지 않습니다unique_ptr
Zang MingJie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.