2016-04-20 15 views
8

Aşağıdaki kodu bir ROS uygulamasında kullanıyorum.Oluşturucu başvuru parametresi seg hatayla sonuçlanır

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; 
} 

Yukarıdaki kodu çalıştırdığımda SIGSEGV'ye yol açar. Ben kod hata ayıklamak için çalıştı ve ben RobotisController yapıcı ulaşmak, nh gösterir değişkeni, ancak bellek zaten RosWrapper sınıfında ayrılmış olduğunu gösterir.

cevap

8

Üye değişkenleri, sınıf tanımındaki beyan sırasına göre başlatılacaktır. Bu, 'un controller_'dan sonra başlatılacağı anlamına gelir. Bu nedenle, controller_'un başlatılması için argüman olarak başlatılmamış bir nh_'u UB'ye yönlendirecektir. Yani benim açımdan bir aptal hata oldu ..

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

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

Vay .. Teşekkürler .. – Lonewolf

+0

Rica ederim @Lonewolf:

Sen beyanı sırasını değiştirebilir. :) – songyuanyao

İlgili konular