构造函数引用参数导致段错误
Constructor reference parameter results in seg fault
我在 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
,但是内存已经分配在 class罗斯包装器。
成员变量将按照class定义中声明的顺序进行初始化。这意味着 nh_
将在 controller_
之后初始化。因此传递一个未初始化的 nh_
作为参数来初始化 controller_
将导致 UB.
您可以更改声明顺序:
class RosWrapper {
protected:
ros::NodeHandle nh_; // nh_ will be initialized firstly
Robotis::RobotisController controller_;
....
public:
RosWrapper() :
controller_(nh_) {}
}
我在 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
,但是内存已经分配在 class罗斯包装器。
成员变量将按照class定义中声明的顺序进行初始化。这意味着 nh_
将在 controller_
之后初始化。因此传递一个未初始化的 nh_
作为参数来初始化 controller_
将导致 UB.
您可以更改声明顺序:
class RosWrapper {
protected:
ros::NodeHandle nh_; // nh_ will be initialized firstly
Robotis::RobotisController controller_;
....
public:
RosWrapper() :
controller_(nh_) {}
}