web-dev-qa-db-ja.com

pcl :: PointCloudからpcl :: PointCloud :: Ptrを作成します

これが可能かどうか知りたいのですが。私は機能を持っています:

 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に正しいティックを与えました。

12

これは古く、おそらく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()を使用すると、クラウドがディープコピーされます。プログラムは正しく動作しますが、追加のコピーが必要ない場合は、最適とは言えません。

6
patatahooligan

はい、 makeShared() メソッドを使用します。

13
ergosys