闪亮的马路 发表于 2023-4-4 15:20:14

类中声明与定义

智能指针在用的时候一定要初始化,要不然运行的时候会出错(可以正常编译)。下面以pcl库做一个简单的说明。
在函数里面进行初始化:

在main函数是声明+初始化一起的
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source (new pcl::PointCloud<pcl::PointXYZ>)

在类里面初始化:类内部初始化的时候,不可以跟上面那样使用new关键字进行初始化,可以使用智能指针的reset方法在构造函数里面进行初始化:

input_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>());

也就是说classA的h文件中声明了classB,在cpp文件的初始化中只能通过reset来实现,为什么呢?

注:pcl::PointCloud<pcl::PointXYZ>::Ptr其实是一个封装的boost::shared_ptr

isdkz 发表于 2023-4-4 15:23:59

智能指针如 boost::shared_ptr 是为了在 C++ 中实现自动内存管理而设计的。它们会自动跟踪资源的引用计数,并在引用计数为零时自动释放资源。这有助于避免内存泄漏和资源未释放的问题。

在类中使用智能指针时,为了保持代码清晰和遵循初始化列表的使用,通常会在类的构造函数中进行初始化。在这种情况下,我们不能像在 main 函数中那样使用 new 关键字直接初始化智能指针。原因如下:


[*]初始化列表:在类构造函数中,成员变量的初始化应该在初始化列表中进行。初始化列表能确保成员变量在构造函数体执行之前被初始化。然而,初始化列表不支持使用 new 进行初始化。

[*]资源管理:使用智能指针的 reset 方法在构造函数中初始化能够确保资源被正确管理。reset 方法不仅分配新资源,还确保智能指针关联的旧资源在必要时被正确释放。这有助于避免资源泄漏。


因此,在类中初始化智能指针时,推荐使用 reset 方法。这种方式能保持代码清晰,同时确保资源被正确管理。例如:

class MyClass {
public:
    MyClass() {
      input_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>());
    }

private:
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr input_cloud;
};

总之,使用 reset 方法在类中初始化智能指针是因为这种方式遵循了初始化列表的使用,并确保了资源的正确管理。
页: [1]
查看完整版本: 类中声明与定义