2016-09-27 6 views
0

protobufメッセージを再利用するには、最初にメッセージ(msg_test、msg_proto)を割り当ててから、ループで送信します(すべてのループでclear、set、sendなど)。protobuf SerialSerializeWithCachedSizesToArrayでSerializeToArrayラジーセグメンテーションフォールト

protobuf構文= "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)、サイズ) ?0:-1;

は誰でも助けることができる、セグメンテーションフォールト、 InternalWriteMessageNoVirtualToArray でInternalSerializeWithCachedSizesToArray

: が停止:

エラー情報のようなものですか?

答えて

0

msg_proto->set_allocated_count(msg_test)を呼び出して、msg_testの所有権をループの各繰り返しでmsg_protoに割り当てている可能性があります。あなたが最初にそれを行うのは問題ありませんが、次にset_allocated_count()を呼び出すときにループの次回には、msg_testが削除され、現在ダングリングしているポインタを再割り当てします。最も簡単な解決策は、このように、set_allocated_count()を呼び出し避け、代わりにちょうどmsg_testのコピーを割り当てることです:

*msg_proto->mutable_count() = msg_test; 
+0

はい、あなたの答えをありがとう、私はコードをチェックし、msg_testが複数回削除されたい。すべてのループに対して、msg_proto-> Clear()とmsg_proto-> set_allocated_count(msg_test)の両方がmsg_testを削除します。 msg_testを再利用するために、ループの最後にmsg_proto-> release_count()を試してみました。 – zjc