要重用protobuf消息,我首先分配它(msg_test,msg_proto),然后在循环中发送它(对于每个循环执行类似clear,set,send的操作)。
protobuf syntax =“proto3”;
呼叫:
int i=0;
while(true){
SendTestImprove(i++);
usleep(1000*1000);
}
功能:
int SendTestImprove(int count)
{
msg_test->Clear();
msg_test->set_count(count);
msg_proto->Clear();
msg_proto->set_allocated_count(msg_test);
msg_proto->set_tick_count(GetTickCount());
zmq_msg_t zmsg;
int size = msg_proto->ByteSize();
int rc = zmq_msg_init_size(&zmsg,size);
if(rc==0){
try
{
rc = msg_proto->SerializeToArray(zmq_msg_data(&zmsg),size)?0:-1;
}
catch (google::protobuf::FatalException fe)
{
LOGFMTE("PbToZmq error: %s",fe.message().c_str());
}
}
int zsize = zmq_msg_size(&zmsg);
rc = zmq_msg_send(&zmsg,m_pub,0);
zmq_msg_close(&zmsg);
LOGFMTD("zmq_msg_send,size=%d,zsize=%d",rc,zsize);
return 0;
}
当i = 1时发生错误,在该行: rc = msg_proto-> SerializeToArray(zmq_msg_data(& zmsg),size)?0:-1;
错误信息如下: 停止:分段错误,在 InternalWriteMessageNoVirtualToArray ,InternalSerializeWithCachedSizesToArray
有人可以帮忙吗?
答案 0 :(得分:0)
可能的问题是,您通过调用msg_test
在循环的每次迭代中将msg_proto
的所有权分配给msg_proto->set_allocated_count(msg_test)
。第一次这样做很好,但是当你第二次调用set_allocated_count()
时,下一次循环,proto将删除msg_test
并重新分配现在悬空的指针。最简单的解决方案是避免调用set_allocated_count()
而只是分配msg_test
的副本,如下所示:
*msg_proto->mutable_count() = msg_test;