从 pcl::P ointCloud 创建一个 pcl::P ointCloud::P tr

Create a pcl::PointCloud::Ptr from a pcl::PointCloud

本文关键字:pcl ointCloud 一个 tr 创建      更新时间:2023-10-16

我想知道这是否可能。我有一个功能:

 pcl::PointCloud<pcl::PointXYZRGB> createPointCloud(std::Vector<Nodes> input)

返回一个点云。我想知道是否有可能获取此点云,并指向它的副本。PCL 像这样制作指向云的指针:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>)

我试过这样做:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(createPointCloud(nodeList))

这会导致一个非常明显的错误,即createPointCloud不返回指向云的指针。

我也试过这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR = &createPointCloud(nodeList)

而这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(&createPointCloud(nodeList))

这会导致编译错误:"获取临时地址">

是让函数返回指针类型的唯一选择,还是有办法完成我所要求的?

编辑:

以下两个答案都是正确的,我给了乔纳森正确的勾号,因为他这次先进去了。

是的,使用 makeShared(( 方法。

我知道

这很旧,可能对 OP 没有用,但其他用户可能会偶然发现它。我建议这样做如下:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>);
*cloudPTR = createPointCloud(nodeList);

Jonathon的回答是危险的原因是Pointcloud::P tr是boost::shared_ptr的typedef,这意味着所指向对象的所有权。然而,在他的回答中,该对象实际上是一个局部变量,这意味着它可能超出范围,而仍然有对它的引用,并且shared_ptr最终将对其调用删除,这是未定义的行为。

另一方面,使用 make_shared(( 深度复制云。该程序将正常工作,但是如果您不需要额外的副本,则远非最佳。