在InternalSerializeWithCachedSizesToArray中的protobuf SerializeToArray rasie分段错误

时间:2016-09-27 01:42:50

标签: c++ protocol-buffers zeromq

要重用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

有人可以帮忙吗?

1 个答案:

答案 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;