传递boost :: shared_ptr引用的安全性

时间:2011-01-20 23:23:42

标签: 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 (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概念的一部分,如果我只在这个范围内使用它,我会遇到麻烦吗?

2 个答案:

答案 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。