如何获取pcl::PointCloud中单个点的指针?避免内存重复存储
Great question—this is a common concern when building graph structures with PCL to avoid redundant memory usage, so let’s break this down clearly.
核心结论:直接取迭代器解引用后的地址是可行的
When you use iterators with pcl::PointCloud<pcl::PointXYZ>, the iterator returns a reference to the actual point stored in the cloud’s underlying std::vector<pcl::PointXYZ> (the points member of the cloud). Dereferencing the iterator gives you a direct reference to the point, not a copy. So taking the address of that dereferenced value will give you a valid pointer to the original point in the cloud.
具体实现示例
Here are two straightforward ways to get pointers to individual points:
1. Using Iterators
// Assume we have an initialized point cloud (using smart pointer for safe lifecycle management) pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>(); // ... populate the cloud with points ... for (auto it = cloud->begin(); it != cloud->end(); ++it) { // Get pointer to the actual point in the cloud pcl::PointXYZ* point_ptr = &(*it); // Store this pointer in your graph structure // graph.add_node(point_ptr); }
2. Using Index Access (More Intuitive)
Since pcl::PointCloud exposes its underlying points via the points vector, you can directly access points by index and take their address:
for (size_t i = 0; i < cloud->size(); ++i) { // Two equivalent ways to get the pointer pcl::PointXYZ* point_ptr = &cloud->points[i]; // Or, using the cloud's operator[] (which wraps points[i]) pcl::PointXYZ* point_ptr_alt = &(*cloud)[i]; }
Critical Notes to Avoid Bugs
- Lifecycle Management: Ensure your point cloud outlives the graph structure. If the cloud is destroyed while the graph still holds pointers to its points, you’ll end up with dangling pointers (undefined behavior). Using
pcl::PointCloud::Ptr(a shared pointer) is highly recommended here—it will keep the cloud alive as long as any references (including your graph’s pointers) exist. - Avoid Modifying Cloud Structure: If you add/remove points from the cloud after storing pointers, the underlying
std::vectormay reallocate memory (when it needs to expand), which invalidates all existing pointers to its elements. Finish building your graph before modifying the cloud’s size, or use a different container if dynamic resizing is necessary (though PCL’s default vector is standard for most use cases).
内容的提问来源于stack exchange,提问作者Dave Durbin

