2016-04-20 18 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につながります。それは私の一部の愚かな誤りだった...

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

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

うわー..おかげで.. – Lonewolf

+0

どういたしまして@Lonewolf:

あなたは宣言の順序を変更する場合があります。 :) – songyuanyao

関連する問題