2016-04-20 14 views
8

Ich verwende den folgenden Code in einer ROS-Anwendung.Konstruktor-Referenzparameter führt zu Seg-Fehler

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

Wenn ich den obigen Code ausführen, führt es zu einem SIGSEGV. Ich habe versucht, den Code zu debuggen und als ich den Konstruktor des RobotisController erreiche, finde ich, dass die Variable, die an den Konstruktor nh übergeben wird, cannot access memory anzeigt, aber der Speicher ist bereits in der Klasse RosWrapper zugewiesen.

Antwort

8

Die Membervariablen werden in der Klassendefinition in der Reihenfolge der Deklaration initialisiert. Das bedeutet, dass nh_ nach controller_ initialisiert wird. So übergeben Sie eine nicht initialisierte nh_ als Argument zur Initialisierung wird zu UB führen.

Sie können die Reihenfolge der Deklaration ändern:

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

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

Wow .. Das ist ein dummer Fehler von mir war .. Danke .. – Lonewolf

+0

@Lonewolf Sie sind willkommen. :) – songyuanyao

Verwandte Themen