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

Fan*_*Fox 12 c++ pointers point-cloud-library

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

 pcl::PointCloud<pcl::PointXYZRGB> createPointCloud(std::Vector<Nodes> input)
Run Code Online (Sandbox Code Playgroud)

返回点云.我想知道是否可以采用这一点云,并指出它的副本.pcl像这样指向云:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>)
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(createPointCloud(nodeList))
Run Code Online (Sandbox Code Playgroud)

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

我也试过这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR = &createPointCloud(nodeList)
Run Code Online (Sandbox Code Playgroud)

还有这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(&createPointCloud(nodeList))
Run Code Online (Sandbox Code Playgroud)

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

是函数返回指针类型的唯一选择还是有办法做我要求的?

编辑:

以下两个答案都是正确的,我已经给Jonathon这个时候第一次得到了正确的答案.

erg*_*sys 13

是的,使用makeShared()方法.


pat*_*gan 7

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

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>);
*cloudPTR = createPointCloud(nodeList);
Run Code Online (Sandbox Code Playgroud)

Jonathon的答案之所以危险是因为Pointcloud :: Ptr是boost :: shared_ptr的类型定义,它暗示了所指向对象的所有权。但是,在他的回答中,该对象实际上是一个局部变量,这意味着它可能会超出范围,而仍然有对其的引用,并且shared_ptr最终将对其进行调用delete,这是未定义的行为。

另一方面,使用make_shared()可以深度复制云。该程序可以正常运行,但是如果您不需要多余的副本,那将不是最佳选择。