C++ 在pcl中的一些指针用法

9 篇文章 1 订阅
std::shared_ptr的用法

在C++中,特别是在使用点云库(如PCL)进行3D点云数据处理时,智能指针的使用非常常见。这些智能指针可以自动管理内存,避免内存泄漏和悬垂指针等问题。其中,std::shared_ptr是一种非常常用的智能指针类型。

在PCL库中,std::shared_ptr的使用非常普遍,主要用于以下几种情况:

  1. 创建和操作点云对象:PCL库中的点云对象通常由std::shared_ptr<pcl::PointCloud<T>>类型的智能指针管理,其中T是点云中点的类型(如pcl::PointXYZ)。这样可以确保在点云对象不再需要时自动删除它,避免内存泄漏。

    std::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
  2. 创建和操作点云索引:当需要对点云进行操作(如滤波、分割等)时,通常会生成一个点的索引列表。这个索引列表可以用std::vector<std::pair<int, int>>来存储,其中每个元素包含一个点的索引和它所属的集群的ID。这样可以避免手动管理内存,尤其是在处理大量数据时。

    std::vector<std::pair<int, int>> indices;  
    // ... 填充 indices ...  
    for (const auto& index : indices) {  
        cloud->points[index.first].cluster_id = index.second;  
    }
    
    //举个详细的例子
    #include <iostream>  
    #include <vector>  
    #include <utility>  
      
    int main() {  
        // 假设有一个点云数据,包含10个点的坐标  
        std::vector<std::pair<int, int>> cloud_data = {  
            {0, 1.0}, {1, 2.0}, {2, 3.0}, {3, 4.0}, {4, 5.0},  
            {5, 6.0}, {6, 7.0}, {7, 8.0}, {8, 9.0}, {9, 10.0}  
        };  
      
        // 创建一个空的索引列表  
        std::vector<std::pair<int, int>> indices;  
      
        // 从点云数据中选择索引为偶数的点,将其加入到索引列表中  
        for (int i = 0; i < cloud_data.size(); i += 2) {  
            indices.push_back({i, cloud_data[i].second});  
        }  
      
        // 打印索引列表中的点坐标  
        for (const auto& index : indices) {  
            std::cout << "Index: " << index.first << ", X: " << cloud_data[index.first].first << ", Y: " << cloud_data[index.first].second << std::endl;  
        }  
      
        return 0;  
    }
    
  3. 创建和操作点云中的点:点云中的每个点也可以用std::shared_ptr<pcl::PointXYZ>来管理。这样可以确保在点不再需要时自动删除它,避免内存泄漏。

    std::shared_ptr<pcl::PointXYZ> point(new pcl::PointXYZ);  
    point->x = 1.0;  
    point->y = 2.0;  
    point->z = 3.0;  
    cloud->points.push_back(*point);
    
  4. 创建和操作KdTree对象:PCL库中的KdTree对象通常由std::shared_ptr<pcl::search::KdTree<pcl::PointXYZ>>类型的智能指针管理。这样可以确保在KdTree对象不再需要时自动删除它,避免内存泄漏。

    std::shared_ptr<pcl::search::KdTree<pcl::PointXYZ>> tree(new pcl::search::KdTree<pcl::PointXYZ>);
    
ptr的一些用法

在C++中,指针是一种数据类型,用于存储另一个变量的内存地址。指针的主要用法有以下几点:

  1. 声明指针变量:使用*操作符声明一个指针变量,例如int *ptr;
  2. 初始化指针变量:为指针变量分配内存空间并赋值,例如int a = 10; int *ptr = &a;
  3. 解引用指针:通过*操作符访问指针所指向的内存空间的值,例如int value = *ptr;
  4. 指针运算:指针可以进行加减运算,以改变指针所指向的内存空间的位置,例如ptr += 2;
  5. 指针数组:可以声明一个指针数组,用于存储多个指针,例如int *arr[3];
  6. 函数参数传递:可以将指针作为函数参数传递,以便在函数内部修改指针所指向的值,例如void swap(int *a, int *b);
  7. 动态内存分配:可以使用new关键字动态分配内存空间,并将返回的地址赋给指针,例如int *ptr = new int;
  8. 释放内存:使用delete关键字释放指针所指向的内存空间,例如delete ptr;
#include <iostream>
using namespace std;

// 声明指针变量
int *ptr;

// 初始化指针变量
int a = 10;
ptr = &a;

// 解引用指针
cout << "Value of a: " << *ptr << endl;

// 指针运算
ptr += 2;
cout << "Value of a after pointer addition: " << *ptr << endl;

// 指针数组
int *arr[3];
for (int i = 0; i < 3; i++) {
    arr[i] = new int;
}

// 函数参数传递
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 动态内存分配
int *ptr2 = new int;
*ptr2 = 20;
cout << "Value of ptr2: " << *ptr2 << endl;


解析
pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud (new pcl::PointCloud<pcl::PointXYZ>)

在C++中,pcl::PointCloud<pcl::PointXYZ>::Ptr是一个智能指针,它用于指向pcl::PointCloud<pcl::PointXYZ>类型的对象。智能指针是一种特殊的指针,它可以自动管理其指向的对象,例如,当智能指针不再需要指向该对象时,智能指针会自动删除其指向的对象。以下是在pcl::PointCloud<pcl::PointXYZ>::Ptr智能指针上可能使用的一些操作:

  1. 分配内存:使用new关键字为智能指针分配内存。如你所做的那样:pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud (new pcl::PointCloud<pcl::PointXYZ>); 这行代码创建了一个新的pcl::PointCloud<pcl::PointXYZ>对象,并将其分配给source_cloud智能指针。
  2. 间接引用:你可以使用*操作符来间接引用智能指针,从而访问它所指向的对象。例如:source_cloud->width() 可以访问source_cloud所指向的pcl::PointCloud<pcl::PointXYZ>对象的width()成员。
  3. 比较:你可以使用==!=操作符来比较两个智能指针是否指向同一个对象,或者是否都不指向任何对象。例如:if (source_cloud == nullptr) 可以检查source_cloud是否指向任何对象。
  4. 重设值:你可以使用=操作符来重设智能指针的值。例如:source_cloud = nullptr; 可以将source_cloud重新设置为nullptr
  5. 自动删除:当智能指针超出其作用域时,它会自动删除其指向的对象。这意味着你不需要显式地调用delete来释放内存。
使用指针类型的对象 和 使用非指针类型的对象
// 使用非指针类型的对象
pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud (new pcl::PointCloud<pcl::PointXYZ>);
source_cloud->points.push_back(pcl::PointXYZ(1, 2, 3));

// 使用指针类型的对象
pcl::PointCloud<pcl::PointXYZ> source_cloud;
source_cloud.points.push_back(pcl::PointXYZ(4, 5, 6));

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值