2017-12-01 39 views
0

로부터 상속 된 클래스에서 unique_ptr 반환 나는 왜 빌더 방법 Class::create()unique_ptrunique_from_this()가 있습니까? 또는 방법 enable_shared_from_this

을 반환하려면?

1)이 설계는 공유 소유권 (및 원 자성 잠금)을 시행하지 않습니다. unique_ptr은 매우 효율적이고 아직도, 클래스 사용자의 측면에 shared_ptr으로 이동하기 쉽다) void*

2와 동일한 크기를 가지고 (그러나 클라이언트는 여러 소유의 인스턴스)

을 공유하고자하는 경우에만

그럼. 내가 사용하는 것에 대해서만 지불하고 싶습니다.

하지만. "this"포인터를 반환하는 클래스 인스턴스의 메서드가 필요합니다. 내가 enable_shared_from_this에서 클래스를 상속하는 경우 난 그냥 return shared_from_this를 사용하지만 나는 그것이 유일한 소유권 것이다 (물론) (shared_from_this를 사용하지 않고) 클래스 어딘가에서 만든 unique_ptr 어떻게 든 즉

, 관련이 없을 것이라고 생각 이 unique_ptr에서 생성 된 (잠재) shared_ptr와 관련이 있습니까? 아니면 이중 삭제 문제로 이어질 것인가?

+0

TBH 'this'를 'unique_ptr'에 쉽게 넣을 수 있고 'shared_ptr'과 같은 문제는 해결할 수 없기 때문에 이것이 합리적이지는 않습니다. – Galik

+0

이제 보자. 나는 own_ptr을 Owner 클래스에 반환했다. 그런 다음 shared_ptr로 이동하고 OtherOwner와 같은 다른 클래스에 핸들을 제공하여 강력한 공유 참조를 유지합니다. 하지만 어떻게이 공유 된 그룹을 클래스 인스턴스 자체에서 찾을 수 있습니까? – barney

+2

이것은 의미 론적 의미가 없습니다. 이 멤버 함수를 호출 할 객체가 있으면 이미 * something *이 소유하고 있습니다. 일반적인 경우에 어떻게 고유 한 소유자를 얻을 수 있습니까? – StoryTeller

답변

1

다른 말로하면 unique_ptr은 (물론 shared_from_this()를 사용하지 않고)이 unique_ptr에서 생성 된 (잠재적 인) shared_ptr과 어떻게 관련이 있을까요? 아니면 이중 삭제 문제로 이어질 것인가?

생성자가 unique_ptr가 제대로 그 포인터를 해제하면 그래서 그래, 당신은 더 이중 삭제가없는 것하고 shared_from_this() 멤버가 올바르게 작동합니다 (그러나 클라이언트가있는 경우 UB를 얻을 수 있습니다, 당신 공개적으로 액세스 할 수 enable_shared_from_this 기반을 감지합니다 shared_ptr 그것을 관리없이 기존 shared_ptr의)와 함께 호출 : 또한

auto unique = Class::create(); 
auto shared = std::shared_ptr<Class>{ std::move(unique) }; // ok, pass ownsership to shared 
auto shared_again = shared->shared_from_this(); // ok 

auto unique2 = Class::create(); 
auto badly_shared = unique2->shared_from_this(); // nope, UB 
auto badly_shared_again = std::shared_ptr<Class>{ unique2.get() }; // nope, double deletion coming ... 

을, C++ 17 shared_from_this() 년부터 비 공유 인스턴스에서 호출 할 때 bad_weak_ptr 발생합니다.

+0

이 표시됩니다. 따라서 고유 한 소유권은 공유와 관련이 없습니다 (예 : new에서 raw * 포인터를 작성하는 경우). 하지만 내가 올바르게 이동/고유에서 공유로 변환, 소유권을 올바르게 유지됩니다 및 shared_from_this() 인스턴스에서 사용할 수 있습니다. 이제 고마워요! – barney

+1

@barney, yep 그리고 C++ 17에서 클라이언트가 shared_from_this()를 호출하려고하면 멋진 예외가 발생합니다 ... –

1

unique_from_this()가 있습니까?

번호

또는 enable_shared_from_this 일반적으로

로부터 상속 된 클래스, 특별한 아무것도 enable_shared_from_this에서 상속 클래스에 unique_ptr을 반환 할 수 없습니다에서 unique_ptr 반환 방법에 대해 설명합니다. 그러나 이 소유 한 인스턴스에서 shared_from_this을 호출하면 안됩니다. 따라서 안전하지 않습니다.

enable_shared_from_this이 상속되었는지 여부에 관계없이 unique_ptr ~ this을 안전한 방법으로 만들 수 없습니다.

1)이 설계는 공유 소유권 (및 자물쇠)을 강제하지 않습니다.unique_ptr은 매우 효율적이며 같은 void*

같은 크기와 unique_ptr 신속하게 공유 소유권의 부족을 가지고, 구현 unique_from_this 불가능하게에도 효과가있을 것이다.

+0

이제 그 명확하고 고마워요. 일단 내가 공유 소유권으로 이동 클래스 클라이언트로 고유 한 소유권을 내 책임을 만듭니다. 그런 다음 클래스 인스턴스는 shared_from_this()에 의해 참여할 수 있습니다. 즉, 클래스를 유연하게 (공유 빌더 메소드 또는 고유 빌더 메소드로) 사용하려면 고유 한 값을 반환 할 수 있지만 enable_shared_from_this 클래스에서 상속받습니다. 그러나 shared_from_this()를 호출하기 전에 공유에서 이동하는 클라이언트의 책임. – barney