【问题标题】:Using boost::shared_ptr to refer to iterator without copying data?使用 boost::shared_ptr 来引用迭代器而不复制数据?
【发布时间】:2014-08-07 09:49:10
【问题描述】:

在循环中,我需要调用一个参数类型为pcl::PointIndicesPtr 的函数。这实际上是一个boost::shared_ptr< ::pcl::PointIndices>。有没有办法做到这一点而不必复制基础数据?我只能通过使用make_shared 来工作,如果我理解正确,它会复制对象。

for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it !=     cluster_indices.end (); ++it)
{          
   pcl::PointIndicesPtr indices_ptr2 =boost::make_shared<pcl::PointIndices>(*it);          
}

例如,这将在运行时崩溃:

for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it !=     cluster_indices.end (); ++it)
{          
   pcl::PointIndices test  = *it;    
   pcl::PointIndicesPtr indices_ptr3(&test);        
}

【问题讨论】:

  • 当然会,你传递一个指向临时对象的指针,它在循环迭代或结束时被销毁......

标签: c++ boost


【解决方案1】:

答案取决于您调用的函数的实现以及您的代码对该对象的其他作用。没有“一个正确的答案”。

例如,如果函数在返回后无法访问对象,那么正确的答案可能是使用带有虚拟析构函数的shared_ptr 包装现有对象。但是如果函数隐藏了shared_ptr,那就行不通了。

如果您自己的代码从不修改对象,那么首先使用make_shared 构造对象可能是正确的答案。但是,如果您的代码修改了对象,而函数希望它以后不会更改,那将不起作用。

您必须根据所有信息做出决定。

要回答的最重要的问题 -- 为什么您调用的函数需要shared_ptr?它有充分的理由吗?如果是这样,那是什么原因?如果没有,为什么不改成参考呢?

【讨论】:

  • +1 表示“要回答的最重要的问题——为什么你调用的函数需要一个 shared_ptr”
  • 我无法修改我要调用的函数,因为它是第三方代码。但我认为它返回后不会访问对象。
  • 我只是担心该对象被不必要地复制,但它的工作速度相当快,所以我想我会坚持使用 make_shared
【解决方案2】:

你能用 BOOST_FOREACH 吗? 即

BOOST_FOREACH(pcl::PointIndiciesPtr ptr; cluster_indicies)
{
    //do something with shared_ptr
}

【讨论】:

  • 这似乎无关紧要。还有语法错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2015-04-04
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多