闪亮的马路 发表于 2020-12-11 16:39:51

关于类中指针初始化的问题

以下是一个大概的程序结构,我运行的时候一直报段错误,但是把初始化指针放在函数内部就没有问题,不知道是哪里的问题?


// point_cloud_yz.h文件
class PointCloudYZ
{
private:

public:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;   //Ptr是pcl定义的一个类型,会返回一个smart point



PointCloudYZ();


~PointCloudYZ();


int loadPCD();

};

#endif
#include "point_cloud_yz.h"

//point_cloud_yz.cpp文件
PointCloudYZ::PointCloudYZ()
{

cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);

}

int loadPCD()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_test (new pcl::PointCloud<pcl::PointXYZ>);
std::cout << *cloud_test<< std::endl;   //这里是可以打印信息的
std::cout << *cloud<< std::endl;//这里只是测试,因为程序运行时,这里有问题,会出现段错误,应该是野指针,推断是构造函数初始化有问题
}

//
PointCloudYZ::~PointCloudYZ()
{
}


//main.cpp
#include "point_cloud_yz.h"
int main(int argc, char **argv)
{
PointCloudYZ *test;
test->loadPCD();
}

闪亮的马路 发表于 2020-12-11 16:57:38

PointCloudYZ *test; 修改为PointCloudYZ *test = newPointCloudYZ;是可行的,谁能解释一下?

永恒的蓝色梦想 发表于 2020-12-11 18:17:08

闪亮的马路 发表于 2020-12-11 16:57
PointCloudYZ *test; 修改为PointCloudYZ *test = newPointCloudYZ;是可行的,谁能解释一下?

构造函数什么问题没有,但是你声明了指针不分配空间就是大问题了

sfqxx 发表于 2023-4-12 19:20:53

在代码中,loadPCD函数定义是在类外部实现的,它没有指定所属的类,因此编译器将其视为全局函数。由于loadPCD函数没有访问类成员变量,因此在该函数中没有定义类指针this,故访问到的cloud指针是未初始化的野指针。

解决方法是在loadPCD函数前添加“PointCloudYZ::”以说明loadPCD函数所属的类是PointCloudYZ。修改后代码如下:


// point_cloud_yz.h文件
class PointCloudYZ
{
private:

public:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;   //Ptr是pcl定义的一个类型,会返回一个smart point



PointCloudYZ();


~PointCloudYZ();


int loadPCD();

};

#include "point_cloud_yz.h"

//point_cloud_yz.cpp文件
PointCloudYZ::PointCloudYZ()
{

cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);

}

int PointCloudYZ::loadPCD()// 加上 PointCloudYZ:: 表示 loadPCD 函数属于 PointCloudYZ 类
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_test (new pcl::PointCloud<pcl::PointXYZ>);
std::cout << *cloud_test<< std::endl;   //这里是可以打印信息的
std::cout << *cloud<< std::endl;//这里只是测试,因为程序运行时,这里有问题,会出现段错误,应该是野指针,推断是构造函数初始化有问题
}

PointCloudYZ::~PointCloudYZ()
{
}

//main.cpp
#include "point_cloud_yz.h"
int main(int argc, char **argv)
{
PointCloudYZ *test = new PointCloudYZ(); // 需要创建一个 PointCloudYZ 对象才能调用它的函数
test->loadPCD();
delete test; // 在程序结束前需要释放指针
}
有用请设置最佳答案
页: [1]
查看完整版本: 关于类中指针初始化的问题