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
복귀 CONST의 shared_ptr에,이 함수의 호출이 I가있는 shared_ptr의 기준 카운트의 +/-를 방지 할 수 있도록, 내부 데이터 구조를 참조하여
창을 가리킬 수 리턴 shared_ptr을 변경하지 않도록하므로
shared_ptr에는 const StructA &이 저장되어 있으므로 호출자는 const shared_ptr의 내용을 변경할 수 없습니다. 내가 맞다면 shared_ptr이 const 일지라도 데이터가 const가 아니라면 호출자가 지적한 데이터를 변경하는 것을 막을 수 없습니다.
내가 어떤 실수
- 내 이해를 수정하십시오는이 기능을위한 최적의 반환 서명을 제공합니다.
shared_ptr'X = some other value'를하고 싶지 않거나 (* X) = 다른 값을 원하지 않습니까? – RedX
2> 공유 포인터의 모든 목적을 전복함으로써 * 매우 위험합니다 *. 이제는 3 번 사용되었다고 생각하는 포인터가 있지만 실제로는 6 번 사용되었고 3 번 릴리스 이후에 사용할 때는 throw되지 않습니다 (segfault). 또한 각 참조에서 범위가 닫히기 때문에 자체를 6 번 해제하려고 시도 할 수도 있습니다. – ssube
참조 유형을 포함하는 공유 포인터를 만드는 것이 합법적이라고 생각조차하지 못했습니다 ... Eeevil – jalf