C ++ 11 표준 라이브러리는 a std::shared_ptr
에서 std::unique_ptr
로 또는 그 반대로 변환 할 수있는 유틸리티를 제공 합니까? 이것이 안전한 작업입니까?
shared_ptr
.
C ++ 11 표준 라이브러리는 a std::shared_ptr
에서 std::unique_ptr
로 또는 그 반대로 변환 할 수있는 유틸리티를 제공 합니까? 이것이 안전한 작업입니까?
shared_ptr
.
답변:
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_ptr
에 std::shared_ptr
하지만 당신은 변환 할 수 없습니다 std::shared_ptr
에 std::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");
std::unique_ptr
std::shared_ptr
unique_ptr u_ptr이 주어지면 shared_ptr s_ptr을 만듭니다.
std::shared_ptr<whatever> s_ptr(u_ptr.release());
다른 길로가는 것은 비현실적입니다.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
내부에 저장을 잃을 수 있기 때문에 안전하지 않습니다unique_ptr