在c ++中解析时,zeromq具有protobuf分段错误

时间:2014-06-27 15:41:31

标签: c++ protocol-buffers zeromq

我正在使用带有protobuf的zeromq来发送/接收消息,但在解析接收到的数据时,代码在接收器端崩溃并出现Segmentation fault (core dumped)错误。

Scan是我的信息。

sender.cpp

Scan proto_ls_msg;
proto_ls_msg.set_angle_min(0.0);
proto_ls_msg.set_angle_max(180.5);
std::string ls_msg_str;
proto_ls_msg.SerializeToString(&ls_msg_str);
zmq::message_t request (ls_msg_str.size());
memcpy (request.data(), ls_msg_str.c_str(),ls_msg_str.size());
socket.send (request);

collector.cpp

zmq::message_t recieved;
socket.recv (&recieved);
//thanks to πάντα ῥεῖ
std::string ls_msg_str((char*)recieved.data(),recieved.size()); 
Scan *pb_laser_msg_rcv;
pb_laser_msg_rcv->ParseFromString(ls_msg_str); // <--  Segmentation fault here

我尝试了将zmq::message_t转换为std::string的不同方法,但仍然会导致细分错误。

修改更新:

//std::string ls_msg_str((char*)recieved); 
  std::string ls_msg_str((char*)recieved.data(),recieved.size());

感谢。

1 个答案:

答案 0 :(得分:0)

IIRC您无法直接将zmq::message_t转换为字符串。您应该只使用data成员来创建字符串。 此外,recieved.data不会'\0'终止,因此您在构建ls_msg_str实例时也需要传递大小:

std::string ls_msg_str((char*)recieved.data,recieved.size);
                                    // ^^^^          ^^^^