构造函数引用参数导致段错误

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_) {}
}