从pcl :: PointCloud创建一个pcl :: PointCloud :: Ptr

时间:2012-05-17 22:38:14

标签: c++ pointers point-cloud-library

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

 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))

这会导致编译错误:“获取临时地址”

唯一的选择是让函数返回一个指针类型,还是有办法做我要问的事情?

编辑:

以下两个答案都是正确的,我已经给了Jonathon正确的勾号,这次是他第一次进入。

2 个答案:

答案 0 :(得分:12)

是的,使用makeShared()方法。

答案 1 :(得分:6)

我知道这是旧的,可​​能不再使用OP,但其他用户可能偶然发现它。我建议按如下方式进行:

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

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

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