我的问题是,以下代码片段是如何自动防故障的,它是我的资源管理器的一部分:
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概念的一部分,如果我只在这个范围内使用它,我会遇到麻烦吗?
答案 0 :(得分:4)
这种用法是安全的,因为通过引用传入的shared_ptr<>
将减少引用的引用次数(假设从shared_ptr<>
返回的seeker->second->Copy()
不是{{1}对于同一个对象)因此可能会删除它指向的对象。
具体来说,您不是从原始指针创建第二个shared_ptr<>
(这是一个错误,因为它会创建第二个不相关的shared_ptr<>
并带有单独的引用计数,因此它是第二个所有者对象)。
您的功能是否提供您想要的行为取决于您想要的内容。
答案 1 :(得分: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
- 无法使用AFAIK。