1

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

非常に多くの選択肢があり、そのうちの1つが最適であると確信しています(残っている人がいる場合は指摘してください)。

個人的には#0の方が好き

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

レガシー システムは#2を使用します

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

#0を選択する理由は次のとおりです。

  1. const shared_ptr を返すため、この関数の呼び出し元は、内部データ構造を指す可能性のある返された shared_ptr を変更しないでください。

  2. 参照渡しなので、shared_ptr の参照カウントの +/- を回避できます

  3. shared_ptr は const StructA& を保持しているため、呼び出し元は const shared_ptr の内容を変更できません。私が正しければ、shared_ptr が const であっても、データが const でない限り、呼び出し元がポイントされたデータを変更するのを防ぐことはできません。

お願いします

  1. 私が間違いを犯した場合は、私の理解を修正してください
  2. この関数に最適なリターン シグネチャを提供します。

ありがとうございました

4

1 に答える 1

2

関数が何をするかによって異なります。

  • StructAの新しいオブジェクトを作成していますか?はいの場合は、shared_ptr のコピーを返す必要があります。
  • 返された参照の下で有効期限が切れないことがわかっている StructA オブジェクトへのアクセスを提供しているだけですか? 次に、 const& を返すことができます(ただし、そうしないでください-以下を参照)

ご想像のとおり、const& on shared_ptr は、それが指すオブジェクトへの非 const アクセスを妨げません。つまり、shared_ptr オブジェクト自体が定数であり、リセットしたり、他のオブジェクトを指すことができないということです。この場合、shared_ptr のセマンティクスは、プレーン ポインターのセマンティクスと同じです。

アクセス ポインタを返すときに const& イディオムをよく使用していました。しかし、最終的には、特にマルチスレッド コードで非常に微妙なバグにつながる可能性があります (注意はしていますが、それでも噛まれてしまいます)。したがって、上記の peachykeen のコメントは的を射ており、私はすべての新しいコードでそのイディオムに従います。戻り値だけでなく、関数の引数が shared_ptr の場合も同様です。最後に、shared_ptr が指すオブジェクトを持っているときはいつでも、実際にそれを持っていることを本当に知りたいと思うでしょう。

于 2012-07-25T15:43:48.423 に答える