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<>通过引用传入的任何内容都会减少它的引用计数(假设shared_ptr<>返回seeker->second->Copy()的不是shared_ptr<>同一个对象),因此它指向的对象可能会被删除。

具体来说,您不是shared_ptr<>从原始指针创建第二个(这是一个错误,因为它会创建第二个,与shared_ptr<>单独的引用计数无关,因此是对象的第二个所有者)。

你的函数是否提供你想要的行为取决于你想要什么。

于 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 回答