C++ 通过boost的安全性::共享的ptr参考
我的问题是,作为我的资源管理器的一部分,以下代码片段的故障安全性如何:C++ 通过boost的安全性::共享的ptr参考,c++,boost,resourcemanager,C++,Boost,Resourcemanager,我的问题是,作为我的资源管理器的一部分,以下代码片段的故障安全性如何: 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
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;
bool加载(std::string name,boost::shared\u ptr&newModel)
{
std::map::const_迭代器导引头;
seeker=models.find(名称);
if(seeker==models.end())
返回false;
newModel=seeker->second->Copy();//Copy返回一个boost::shared\u ptr
返回true;
}
私人:
std::map模型;
因为通过引用传递boost的shared_ptr实际上不是shared_ptr概念的一部分,如果我只在这个范围内使用它,我会遇到麻烦吗?这种用法是安全的,因为通过引用传递的
shared_ptr
都会减少它的refcount(假设从seeker->second->Copy()
返回的shared\u ptr
不是对同一对象的shared\u ptr
),因此它将指向的对象可能会被删除
具体来说,您没有从原始指针创建第二个shared_ptr
(这是一个错误,因为它将创建第二个不相关的shared_ptr
,具有单独的引用计数,因此是对象的第二个所有者)
你的函数是否提供你想要的行为取决于你想要什么。这种用法是安全的,因为通过引用传入的
shared\u ptr
将减少它的refcount(假设shared\u ptr
从seek->second->Copy()返回)
不是同一对象的共享对象),因此它将指向的对象可能会被删除
具体来说,您没有从原始指针创建第二个shared_ptr
(这是一个错误,因为它将创建第二个不相关的shared_ptr
,具有单独的引用计数,因此是对象的第二个所有者)
函数是否提供所需的行为取决于所需的内容。我想您应该这样做:
boost::shared_ptr<Asset::Model> ptr;
if(Load("stuff", ptr))
{
doSomething with ptr
}
但是,我注意到您在标准容器中使用的是范围\u ptr
,这是不可能的。我想您应该这样做:
boost::shared_ptr<Asset::Model> ptr;
if(Load("stuff", ptr))
{
doSomething with ptr
}
但是,我注意到您在标准容器中使用的是scoped\u ptr
,这是不可能的。如果加载失败,我不想返回共享的\u ptr。这就是我返回boolWell的原因。如果加载失败,我不想返回共享的\u ptr。这就是我返回bool的原因