我在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;
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,它会导致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_) {}
}
Run Code Online (Sandbox Code Playgroud)