鱼C论坛

 找回密码
 立即注册
查看: 3095|回复: 3

[已解决]关于类中指针初始化的问题

[复制链接]
发表于 2020-12-11 16:39:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


// 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();
}
最佳答案
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; // 在程序结束前需要释放指针
}
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-11 16:57:38 | 显示全部楼层
PointCloudYZ *test; 修改为PointCloudYZ *test = new  PointCloudYZ;是可行的,谁能解释一下?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 18:17:08 | 显示全部楼层

回帖奖励 +2 鱼币

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

构造函数什么问题没有,但是你声明了指针不分配空间就是大问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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; // 在程序结束前需要释放指针
}
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 01:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表