1. 程式人生 > >關於回撥函式中const std_msgs::String::ConstPtr& msg的一些解釋

關於回撥函式中const std_msgs::String::ConstPtr& msg的一些解釋

      當訊息自動生成到C++程式碼時,定義了幾種型別。其中一個是::Ptr,它被型別化為boost::shared_ptr,另一個是::ConstPtr,它是boost::shared_ptr。通過將const指標傳遞到回撥,我們避免了複製。雖然這對std_msgs::String沒有太大的影響,但對sensor_msgs::PointCloud2卻有很大的影響。如果msg已經是一個指標,為什麼要取msg的地址?那意味著通過引用傳遞。

     boost::shared_ptr是可以共享使用權的指標,如果有多個shared_ptr共同管理同一個物件時,只有這些shared_ptr全部與該物件脫離關係之後,被管理的物件才會被釋放。 shared_ptr的管理機制其實並不複雜,就是對所管理的物件進行了引用計數,當新增一個shared_ptr對該物件進行管理時,就將該物件的引用計數加一;減少一個shared_ptr對該物件進行管理時,就將該物件的引用計數減一,如果該物件的引用計數為0的時候,說明沒有任何指標對其管理,才呼叫delete釋放其所佔的記憶體。

listener.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)    //引用傳遞,這時存放的是由主調函式放進來的實參變數的地址
{
    ROS_INFO("i heard: [%s]", msg->data.c_str());   //c_str()生成一個const char*指標,指向以空字元終止的陣列。msg指向該資料                                                                                     地址
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "listener");

    ros::NodeHandle n;
    ros::Subscribe sub = n.subscribe("chatter", 1000, chatterCallback);
  

    ros::spin();  //迴圈等待回撥函式

    return 0;