2013-03-11 2 views
12

내가 유형 std::unique_ptr의 필드가 클래스 A이 unique_ptr :이동 소유권은 성병 ::

class A 
{ 
public: 
    std::unique_ptr pointer; 
// class body 
}; 

을 그리고 어딘가에 코드를, 내가 할 점 몇 std::shared_ptr의를 사용하고 있습니다 같은 대상. 이제 달성하고자하는 것은 내 클래스의 소유권을 std::unique_ptr으로 이동하는 것입니다. 따라서 shared_ptr이 모두 삭제 될 경우이 unique_ptr이 살아있을 때까지는 내 개체가 살아있을 것입니다.

제 질문은 소유권을 std::shared_ptr에서 std::unique_ptr으로 옮길 수 있습니까? 그렇다면 어떻게해야합니까?

+8

논리적으로 그러한 시나리오는 나에게 이해가 가지 않습니다. onwership을 전송할 수 있다고 잠시 동안 생각해보십시오. 그러나 ** 오직 ** ** shared_ptr' alives 만 있다고 확신 할 때만 할 수 있습니다. 그렇다면'shared_ptr'을'A'의 멤버로, ** 척을 ** unique_ptr로 사용할 수 있습니다. – Nawaz

+1

"소유권을 내 클래스의이 std :: unique_ptr로 옮깁니다. 그러면 모든 shared_ptrs가 삭제 될 경우이 unique_ptr이 계속 유지되는 한 내 객체가 살아있을 것입니다 ..."A에서 하나만 공유하면 어떨까요? – qPCR4vir

+1

같은 객체를 가리키는 N 개의 다른 공유 ptrs가 있다면? 그걸 어떻게 처리 할 수 ​​있니? 'shared_ptr'는 이유 때문에'release' 메소드를 제공하지 않습니다. –

답변

14

논리적으로 이러한 시나리오는 나에게 이해가되지 않습니다.

는 소유권을 이전 할 수 있음을 잠시 동안 가정,하지만 당신은 이 경우에만shared_ptr alives이 있음을 확신 것을 할 수있는, 그렇다면 A의 구성원으로 을 사용하고 인 것으로 가정하면 unique_ptr이 될 수 있습니다.

그리고 당신은 주석 :

사실

, 내가 클래스에 shared_ptr를 만들 수 있습니다. 나는 개념을 조금 더 오해했다고 생각한다. 나는 이런 식으로 행동하고 싶었다 : unique_ptr이 죽으면, 심지어 shared_ptr이 여전히 그것을 가리키고 있지만, 객체 자체도 죽는다. 그러나 그 객체 자체가 파괴되었다는 것을 모르기 때문에 어리 석다. 그러므로 그들은 nullptr이 아닐 것이다. 에스.

그런 경우 잘못된 스마트 포인터가 표시됩니다. 아마도 필요한 것은 std::weak_ptr입니다. 그렇다면 하나의 std::shared_ptr을 사용하고 다른 모든 것은 std::weak_ptr으로 사용하십시오.

+3

글쎄, 사실은 내 코드가 (좋은 이유로)'unique_ptr'을 사용하기 때문에 합법적으로 나왔지만, 복사 불가능한 타입을 처리 할 수없는 lib로부터 데이터를 얻어야 만합니다. 물론 lib를 수정하고 싶지만 업스트림과 배포에는 시간이 걸릴 것입니다. –

관련 문제