Erstelle einen pcl :: PointCloud :: Ptr aus einem pcl :: PointCloud

8

Ich würde gerne wissen, ob das möglich ist. Ich habe eine Funktion:

%Vor%

gibt eine Punktwolke zurück. Ich würde gerne wissen, ob es möglich ist, diese Punktwolke zu nehmen und einen Zeiger auf eine Kopie davon zu machen. pcl macht Zeiger auf Wolken wie folgt:

%Vor%

Ich habe es versucht:

%Vor%

Dies führt zu einem ziemlich offensichtlichen Fehler, z. createPointCloud gibt keinen Zeiger auf eine Cloud zurück.

Ich habe das auch versucht:

%Vor%

und das:

%Vor%

Und das führt zum Kompilierungsfehler: "Adresse von temporär übernehmen"

Ist die einzige Option, dass die Funktion einen Zeigertyp zurückgibt oder gibt es eine Möglichkeit, das zu tun, was ich frage?

BEARBEITEN:

Beide der folgenden Antworten sind korrekt, ich habe Jonathon den richtigen Tick zugesprochen, als er diesmal das erste Mal kam.

    
Fantastic Mr Fox 17.05.2012, 22:38
quelle

3 Antworten

11
%Vor%

Das sollten Sie tun, dann wird es funktionieren.

    
johnathon 17.05.2012, 22:44
quelle
11

Ja, verwenden Sie die Methode makeShared () .

    
ergosys 17.05.2012 22:44
quelle
2

Ich weiß, das ist alt und wahrscheinlich nicht mehr zu OP, aber andere Benutzer könnten darüber stolpern. Ich würde vorschlagen, es wie folgt zu tun:

%Vor%

Hoffentlich wird die Zuweisung rendwertoptimiert sein.

Der Grund, warum Jonathons Antwort gefährlich ist, ist, dass Pointcloud :: Ptr ein typedef für einen boost :: shared_ptr ist, der den Besitz des Objekts, auf das verwiesen wird, impliziert. In seiner Antwort ist das Objekt jedoch tatsächlich eine lokale Variable, was bedeutet, dass es außerhalb des Gültigkeitsbereichs liegen kann, während es noch Verweise darauf gibt und dass shared_ptr schließlich darauf löschen wird, was ein undefiniertes Verhalten ist.

Mit make_shared () hingegen wird die Wolke tief kopiert. Das Programm wird korrekt funktionieren, aber wenn Sie die zusätzliche Kopie nicht benötigen, ist es bei weitem nicht optimal.

    
patatahooligan 20.07.2017 15:57
quelle