2016-04-20 45 views
8

我在ROS應用程序中使用以下代碼。構造函數引用參數導致seg錯誤

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中。

回答

8

成員變量將按類定義中的聲明順序進行初始化。這意味着nh_將在controller_後初始化。所以通過一個未初始化的nh_作爲參數來初始化controller_會導致UB。 @Lonewolf不客氣

class RosWrapper { 
protected: 
    ros::NodeHandle nh_; // nh_ will be initialized firstly 
    Robotis::RobotisController controller_; 
    .... 

public: 
    RosWrapper() : 
      controller_(nh_) {} 
} 
+0

哇..這是我的一個愚蠢的錯誤..謝謝.. – Lonewolf

+0

你可能會改變聲明的順序。 :) – songyuanyao