1

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

 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の概念の一部ではないため、このスコープでのみ使用すると、問題が発生する可能性がありますか?

4

2 に答える 2

4

この使用法は安全です。shared_ptr<>参照を介して渡されたものはすべてrefcountが削減され(shared_ptr<>から返されたものが同じオブジェクトでseeker->second->Copy()はないと仮定)、したがって、参照先のオブジェクトが削除される可能性があります。shared_ptr<>

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

関数が必要な動作を提供するかどうかは、必要なものによって異なります。

于 2011-01-20T23:33:00.310 に答える
1

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

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

この場合、あなたは大丈夫なはずです。

ただし、ここで参照を使用する必要はありません。shared_ptr要素が見つからなかった場合は、aを返し、 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では不可能です。

于 2011-01-22T16:15:09.443 に答える