C++ 使用boost::shared_ptr引用迭代器而不复制数据?
在循环中,我需要调用一个函数,该函数的参数类型为C++ 使用boost::shared_ptr引用迭代器而不复制数据?,c++,boost,C++,Boost,在循环中,我需要调用一个函数,该函数的参数类型为pcl::pointindicatesptr。这实际上是一个boost::shared\u ptr。有没有一种方法可以做到这一点而不必复制底层数据?我只能使用make_shared,如果我理解正确,它会复制对象 for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (
pcl::pointindicatesptr
。这实际上是一个boost::shared\u ptr<::pcl::pointindex>
。有没有一种方法可以做到这一点而不必复制底层数据?我只能使用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::const_iterator it=cluster_index.begin();it!=cluster_index.end();+it)
{
pcl::pointindicatesptr index_ptr2=boost::make_shared(*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);
}
for(std::vector::const_iterator it=cluster_index.begin();it!=cluster_index.end();+it)
{
pcl::PointIndexes test=*it;
pcl::PointIndicateSPTR Indicates_ptr3(&test);
}
您可以使用BOOST\u FOREACH吗?
i、 e
你能用BOOST_FOREACH吗? i、 e
你能用BOOST_FOREACH吗? i、 e
你能用BOOST_FOREACH吗? i、 e
答案取决于您正在调用的函数的实现,以及您的代码对该对象所做的其他操作。没有“一个正确的答案” 例如,如果函数返回后不可能访问对象,正确的答案可能是使用
共享\u ptr
和伪析构函数包装现有对象。但是如果该函数将共享的\u ptr
隐藏起来,则该函数将不起作用
如果您自己的代码从不修改对象,那么首先使用make_shared
构建对象可能是正确的答案。但是,如果您的代码修改了对象,而函数希望它以后不会更改,那么这将不起作用
你必须根据所有的信息做出决定
要回答的最重要问题是--为什么要调用
共享的函数?这有充分的理由吗?如果是,原因是什么?如果不是,为什么不将其更改为引用?答案取决于您调用的函数的实现以及您的代码对该对象执行的其他操作。没有“一个正确的答案”
例如,如果函数返回后不可能访问对象,正确的答案可能是使用共享\u ptr
和伪析构函数包装现有对象。但是如果该函数将共享的\u ptr
隐藏起来,则该函数将不起作用
如果您自己的代码从不修改对象,那么首先使用make_shared
构建对象可能是正确的答案。但是,如果您的代码修改了对象,而函数希望它以后不会更改,那么这将不起作用
你必须根据所有的信息做出决定
要回答的最重要问题是--为什么要调用共享的函数?这有充分的理由吗?如果是,原因是什么?如果不是,为什么不将其更改为引用?答案取决于您调用的函数的实现以及您的代码对该对象执行的其他操作。没有“一个正确的答案”
例如,如果函数返回后不可能访问对象,正确的答案可能是使用共享\u ptr
和伪析构函数包装现有对象。但是如果该函数将共享的\u ptr
隐藏起来,则该函数将不起作用
如果您自己的代码从不修改对象,那么首先使用make_shared
构建对象可能是正确的答案。但是,如果您的代码修改了对象,而函数希望它以后不会更改,那么这将不起作用
你必须根据所有的信息做出决定
要回答的最重要问题是--为什么要调用共享的函数?这有充分的理由吗?如果是,原因是什么?如果不是,为什么不将其更改为引用?答案取决于您调用的函数的实现以及您的代码对该对象执行的其他操作。没有“一个正确的答案”
例如,如果函数返回后不可能访问对象,正确的答案可能是使用共享\u ptr
和伪析构函数包装现有对象。但是如果该函数将共享的\u ptr
隐藏起来,则该函数将不起作用
如果您自己的代码从不修改对象,那么首先使用make_shared
构建对象可能是正确的答案。但是,如果您的代码修改了对象,而函数希望它以后不会更改,那么这将不起作用
你必须根据所有的信息做出决定
要回答的最重要问题是--为什么要调用共享的函数?这有充分的理由吗?如果是,原因是什么?如果没有,为什么不将其更改为引用?当然会,您传递的是指向临时对象的指针,它在循环迭代或结束时被销毁……当然会,您传递的是指向临时对象的指针,它在循环迭代或结束时被销毁……当然会,您传递的是指向临时对象的指针,循环迭代或结束时会被破坏…当然会的,你正在传递一个指向临时的指针,循环迭代或结束时会被破坏…+1表示“最重要的问题是要回答--为什么你调用的函数需要共享的\u ptr”我不能修改我要调用的函数,因为这是第三方代码。但我认为它不会在返回后访问对象。我只是担心对象被不必要地复制,但它的运行速度相当快,因此我认为我将坚持使用make_shared+1来回答“最重要的问题——为什么您调用的函数采用共享的_ptr”我无法修改该函数
BOOST_FOREACH(pcl::PointIndiciesPtr ptr; cluster_indicies)
{
//do something with shared_ptr
}