Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过boost的安全性::共享的ptr参考_C++_Boost_Resourcemanager - Fatal编程技术网

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的原因