質問

私の質問は、私のリソースマネージャーの一部である次のコードスニペットがどのようにフェイルセーフであるかです。

 bool Load(std::string name, boost::shared_ptr<Asset::Model>& newModel)
 {
  std::map<std::string, boost::scoped_ptr<Asset::Model> >::const_iterator seeker;

  seeker = models.find(name);
  if (seeker == models.end())
   return false;

  newModel = seeker->second->Copy(); // Copy returns a boost::shared_ptr<Asset::Model>
  return true;
 }

private:
 std::map< std::string, boost::scoped_ptr<Asset::Model> >  models;

Boostのshared_ptrを参照して渡すことは実際にはShared_ptrの概念の一部ではないため、この範囲でのみ使用する場合、トラブルに遭遇することはできますか?

役に立ちましたか?

解決

この使用法は安全です shared_ptr<> 参照を通過すると、refcountが減少します( shared_ptr<> から返されます seeker->second->Copy() ではありません shared_ptr<> 同じオブジェクトに)したがって、それが指すオブジェクトは削除される可能性があります。

具体的には、1秒を作成していません shared_ptr<> 生のポインターから(これはエラーです。 shared_ptr<> 別のRefCount、したがってオブジェクトの2番目の所有者があります)。

あなたの関数があなたが望む動作を提供するかどうかはあなたが望むものによって異なります。

他のヒント

私はあなたがこのようなことをしたいと思います:

boost::shared_ptr<Asset::Model> ptr;
if(Load("stuff", ptr))
{
     doSomething with ptr
}

この場合、大丈夫です。

ただし、ここで参照を使用する必要はありません。 aを返すだけです shared_ptr 要素が見つからない場合は0に設定します。

 boost::shared_ptr<Asset::Model> Load(std::string name)
 {
  std::map<std::string, boost::scoped_ptr<Asset::Model> >::const_iterator seeker;
  boost::shared_ptr<Asset::Model> retPtr;

  seeker = models.find(name);
  if (seeker == models.end())
   return retPtr;

  retPtr = seeker->second->Copy(); // Copy returns a boost::shared_ptr<Asset::Model>
  return retPtr;
 }

しかし、私はあなたが使用していることに気づきました scoped_ptr 標準的なコンテナでは、AFAIKは不可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top