2012-07-25 7 views
1

StructA을 가리키는 shared_ptr을 반환해야합니다.무엇이 좋은 반환 유형`boost :: shared_ptr <StructA>`입니까?

struct StructA 
{ 
    // complicated struct that also holds other sub-structure 
    .... 
}; 

const boost::shared_ptr<const StructA&>& GetStructA(...) 
{...} #0.5 

const boost::shared_ptr<const StructA>& GetStructA(...) 
{...} #0 

const boost::shared_ptr<StructA>& GetStructA(...) 
{...} #1 

const boost::shared_ptr<StructA> GetStructA(...) 
{...} #2 

boost::shared_ptr<const StructA> 
{...} #3 

boost::shared_ptr<StructA> GetStructA(...) 
{...} #4 

boost::shared_ptr<StructA>& GetStructA(...) 
{...} #5 

boost::shared_ptr<StructA&> GetStructA(...) 
{...} #6 

너무 많은 선택이 있으며 나는 그 중 하나가 가장 좋습니다 (pls는 누군가가 남아 있다면 지적합니다).

개인적으로는 0

const boost::shared_ptr<const StructA&>& GetStructA(...) 
{...} #0 

레거시 시스템은 사용 #을 사용하여 선호 # 2

const boost::shared_ptr<StructA> GetStructA(...) 
{...} #2 

나는 다음과 같이 0# 선택을 선호하는 이유 :

    ,210
  1. 복귀 CONST의 shared_ptr에,이 함수의 호출이 I가있는 shared_ptr의 기준 카운트의 +/-를 방지 할 수 있도록, 내부 데이터 구조를 참조하여

  2. 창을 가리킬 수 리턴 shared_ptr을 변경하지 않도록하므로

  3. shared_ptr에는 const StructA &이 저장되어 있으므로 호출자는 const shared_ptr의 내용을 변경할 수 없습니다. 내가 맞다면 shared_ptr이 const 일지라도 데이터가 const가 아니라면 호출자가 지적한 데이터를 변경하는 것을 막을 수 없습니다.

내가 어떤 실수

  • 한 경우

    1. 내 이해를 수정하십시오는이 기능을위한 최적의 반환 서명을 제공합니다.

  • +0

    shared_ptr'X = some other value'를하고 싶지 않거나 (* X) = 다른 값을 원하지 않습니까? – RedX

    +2

    2> 공유 포인터의 모든 목적을 전복함으로써 * 매우 위험합니다 *. 이제는 3 번 사용되었다고 생각하는 포인터가 있지만 실제로는 6 번 사용되었고 3 번 릴리스 이후에 사용할 때는 throw되지 않습니다 (segfault). 또한 각 참조에서 범위가 닫히기 때문에 자체를 6 번 해제하려고 시도 할 수도 있습니다. – ssube

    +4

    참조 유형을 포함하는 공유 포인터를 만드는 것이 합법적이라고 생각조차하지 못했습니다 ... Eeevil – jalf

    답변

    2

    그것은 함수의 기능에 따라 달라집니다 감사합니다

    • 그것은 StructA의 새로운 객체를 만들 수 있나요? 그렇다면 shared_ptr의 사본을 반환해야합니다.
    • 반환 된 Referece에서 만료되지 않을 것이라는 것을 알고있는 StructA 객체에 대한 액세스를 제공하는 것입니까? 그것은 단지 수단 - 자신을 의심, 객체에 const가 아닌 액세스를 방지하지 않습니다 shared_ptr의 const를 & 그것이 가리키는 당신으로

    - 그럼 당신은 const를 &를 반환 할 수 있습니다 (아래 참조하지 않지만) 그 shared_ptr 개체 자체는 상수이며 재설정하거나 다른 개체를 가리킬 수 없습니다. 이 경우 shared_ptr의 의미는 일반 포인터의 의미와 동일합니다.

    액세스 포인터를 반환 할 때 const & 관용구를 많이 사용했습니다. 그러나 결국 다중 스레드 코드에서 특히 미묘한 버그로 이어질 수 있습니다. (조심 스럽지만 여전히 물지 않습니다.) 그래서 위의 peachykeen의 의견은 자리에 오르고 나는 모든 새로운 코드에 대해 그 관용을 따른다. 반환을 염두에 둘뿐만 아니라 함수 인수가 shared_ptr 일 때도 마찬가지입니다.결국 입니다. 공유 된 객체가 가리키는 객체가있을 때마다 이 실제로이며, 죽은 객체의 shared_ptr에 대한 참조가 아니라 알고 있어야합니다.

    관련 문제