使用boost :: shared_ptr引用迭代器而不复制数据?

时间:2014-08-07 09:49:10

标签: c++ boost

在循环内部,我需要调用一个类型为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);        
}

2 个答案:

答案 0 :(得分:3)

答案取决于您调用的函数的实现以及您的代码对该对象执行的其他操作。没有&#34;一个正确答案&#34;。

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

如果您自己的代码永远不会修改对象,那么首先使用make_shared构建对象可能是正确的答案。但是,如果你的代码修改了对象,而函数希望它不会在以后改变,那么它就不会起作用。

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

要回答的最重要的问题 - 为什么您要拨打的功能是shared_ptr?它有充分的理由吗?如果是这样,那是什么原因?如果没有,为什么不改变它来参考?

答案 1 :(得分:0)

你能使用BOOST_FOREACH吗? 即。

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