2016-09-04 1 views
1

별칭이 지정된 공유 포인터의 관리되는 개체를 가져 오려고합니다. 내 생각은 약한 포인터를 사용했다. 약한 포인터는 어떤 객체도 생성하지 않기 때문에 공유 포인터에서 약한 포인터를 생성하면 약 포인터가 앨리어싱 된 공유 포인터의 저장된 객체를 잊어 버려 약한 포인터를 잠그면 공유 된 포인터가 저장되고 관리됩니다 포인터. 하지만 내가 혼란스러워하는 결과. 약 포인터는 공유 포인터가 생성 된 것을 기억합니까? 그리고 앨리어싱 된 공유 포인터의 관리 객체를 얻는 방법이 있습니까?스마트 포인터의 예기치 않은 동작

template<class T> struct Deleter { 
    void operator()(T* p) const {}; 
}; 

Deleter<T> d {}; 
T t1 {}; 
T* p1 = &t1; 
T t2 {}; 
T* p2 = &t2; 
auto sp1 = std::shared_ptr<T>(p1,d); 
auto sp2 = std::shared_ptr<T>(sp1,p2); 
auto wp = std::weak_ptr<T>(sp2); 
std::cout << sp1.get() << " " << sp2.get() << " " << wp.lock().get() << std::endl; 

생산 0x7fff5798c958 0x7fff5798c948 0x7fff5798c948

+3

무엇이 문제입니까? 당신은 어떤 다른 산출물을 기대 했습니까? – Barry

+0

'0x7fff5798c958 0x7fff5798c948 0x7fff5798c958' –

+0

'shared_ptr'과'weak_ptr'가 예상 한대로 작동하면 매우 나쁠 것입니다. 'shared_ptr'의 앨리어싱은 유용하지 않습니다. – StoryTeller

답변

1

약한 포인터가 구성되어 무엇을 공유 포인터에서 기억 하는가?

shared_ptr에 의해 저장된 원시 포인터를 기억합니다. 나는 당신이 기대하는대로 일이 이루어지면 매우 혼란 스러울 것이라고 생각합니다. 예를 들어 함수가 shared_ptr<T>을 인수로받은 경우 별칭인지 여부는 알 수 없습니다. 그리고 그 기능이 에서 weak_ptr을 가져 가고 싶다면 shared_ptrshared_ptr과 완전히 다른 객체를 얻은 것입니다. weak_ptrshared_ptr으로 실현하는 것은 매우 놀라운 행동입니다.

앨리어싱 shared_ptr은 앨리어싱을 사용하는 shared_ptr과 다른 유형을 저장할 수 있습니다. 유형을 서로 교환 할 필요조차 없습니다. 그리고 에일리어싱 shared_ptr에서 생성 된 weak_ptr은 그것이 구성된 (또는 암시 적으로 변환 가능한 유형) shared_ptr에서 저장된 형식을 가져옵니다.

에일리어싱에 대한 가장 일반적인 사용 사례 인 shared_ptr은 공유 객체의 멤버를 전달하고 그것이 살아 있는지를 확인하는 것이기 때문에 의심 스럽습니다. 나머지 소유 객체가 더 이상 필요하지 않은 경우 그래서 여러분이 만든 시나리오, 즉 앨리어싱 shared_ptr의 타입이 원본과 동일하다면 드문 것 같습니다.

앨리어스 공유 포인터의 관리 객체를 얻는 방법은 있습니까?

알고있는 한, 아니오. 아마 있어야합니다. 이 기능이 유용하다고 생각한다면 제안하십시오. https://groups.google.com/a/isocpp.org/forum/?fromgroups#!forum/std-proposals

+0

설명해 주셔서 감사합니다. 필자가 제시 한 시나리오는 앨리어싱 된 공유 포인터를 속여 관리 대상 객체를 산출하기 위해 만들어졌습니다. 나는이 기능이 부족하다는 것에 놀랐다. 그러나 좋은 이유가있을 수 있습니다. –

+0

@ JiříLechner : 나는 그 기능이 부족한 유일한 이유가 누구도 생각하지 못했던 유일한 이유라고 생각합니다. 그리고 아무도 그것을 필요로하지 않기 때문에 아무도 그것을 생각하지 않는다고 생각합니다. 당신이 그것을 필요로한다면, 당신의 유스 케이스를 살피고, 나의 대답의 맨 아래에 링크 된 포럼에 게시물을 만드십시오. –