2011-01-20 14 views
1

私の質問は、フェイルセーフか、ですが、私のリソースマネージャの一部であり、次のコードスニペットです:安全:: shared_ptrの参照

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; 

参照することによりブーストのshared_ptrのを渡すと、実際の一部ではないので、 shared_ptrのコンセプト、もし私がこのスコープでのみ使うのであれば、問題に遭遇する可能性がありますか?

答えて

4

この使用は、参照を介して渡されたshared_ptr<>は、それが参照カウント減少(shared_ptr<>seeker->second->Copy()から返されたと仮定すると、同じオブジェクトに対してshared_ptr<>ない)、したがって、それがポインティングするオブジェクトの必要がありますどのような点で、安全です〜が削除される可能性があります。

具体的には、未加工のポインタから2番目のshared_ptr<>を作成していません。これは、2番目の無関係のshared_ptr<>を別の参照カウントで作成し、オブジェクトの2番目の所有者を作成するためです。

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

1

は、私はあなたがこのような何かをしたいと思います。この場合

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

あなたは問題ないはずです。

ここではリファレンスを使用する必要はありません。ただ、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を使用している気づいたしかし - 私の知る限りでは不可能です。

+0

ロードが失敗した場合に備えて、shared_ptrを返す必要はありません。それは私がブールを返す理由 – cppanda

関連する問題