12

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

 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 正确的勾号,因为他这次是第一个进入的。

4

2 回答 2

13

是的,使用makeShared()方法。

于 2012-05-17T22:44:31.053 回答
9

我知道这是旧的,可​​能对 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() 对云进行深度复制。该程序将正常运行,但如果您不需要额外的副本,那么它远非最佳。

于 2017-07-20T15:57:29.907 回答