ROS全局规划器makePlan内调用getRobotPose报bad_alloc错误
问题原因
你的代码存在类成员变量和函数形参重名导致赋值失效的问题:
你在头文件中定义了类成员变量 costmap_2d::Costmap2DROS *costmap_ros;,同时initialize函数的传入形参也命名为costmap_ros,因此你在函数内写的costmap_ros = costmap_ros;本质是把形参自己赋值给自己,类的成员变量完全没有被正确赋值,属于未初始化的野指针。
initialize函数执行时调用的是形参传入的有效指针,所以调用getRobotPose不会报错;makePlan函数执行时调用的是类未初始化的成员变量costmap_ros,访问野指针触发内存错误,抛出bad_alloc异常。
修复方案
修改initialize函数内的赋值逻辑,明确指定给类成员变量赋值,两种实现方式均可:
- 加
this指针明确区分成员变量和形参:
void GlobalPlanner::initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros){ nh_ = ros::NodeHandle{"~abcd"}; // 明确给类成员变量赋值 this->costmap_ros = costmap_ros; costmap_ros_ = this->costmap_ros->getCostmap(); // 后续代码保持不变 }
- 修改形参名避免重名冲突:
void GlobalPlanner::initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros_in){ nh_ = ros::NodeHandle{"~abcd"}; costmap_ros = costmap_ros_in; costmap_ros_ = costmap_ros->getCostmap(); // 后续代码保持不变 }
编码规范建议
日常开发中可以给类成员变量统一加标识前缀(如m_)或后缀(如_),避免和形参、局部变量重名,从根源上规避这类错误。
内容的提问来源于stack exchange,提问作者skpro19
相关产品推荐
相关产品推荐

