我在ROS应用程序中使用以下代码。
class RobotisController
{
private:
....
public:
ros::NodeHandle pxxx;
}
RobotisController::RobotisController(ros::NodeHandle& nh) : pxxx(nh)
{
packetHandlerList.push_back(PacketHandler::getPacketHandler(1.0));
packetHandlerList.push_back(PacketHandler::getPacketHandler(2.0));
}
class RosWrapper {
protected:
Robotis::RobotisController controller_;
ros::NodeHandle nh_;
....
public:
RosWrapper() :
controller_(nh_) {}
}
main()
{
RosWrapper interface;
}
当我运行上面的代码时,它会导致SIGSEGV。我尝试调试代码,当到达RobotisController的构造函数时,我发现传递给构造函数
nh
的变量显示cannot access memory
,但是内存已在RosWrapper类中分配。 最佳答案
成员变量将按照类定义中的声明顺序进行初始化。这意味着nh_
将在controller_
之后初始化。因此,传递未初始化的nh_
作为初始化controller_
的参数将导致UB。
您可以更改声明的顺序:
class RosWrapper {
protected:
ros::NodeHandle nh_; // nh_ will be initialized firstly
Robotis::RobotisController controller_;
....
public:
RosWrapper() :
controller_(nh_) {}
}