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
: が停止:エラー情報のようなものですか?
はい、あなたの答えをありがとう、私はコードをチェックし、msg_testが複数回削除されたい。すべてのループに対して、msg_proto-> Clear()とmsg_proto-> set_allocated_count(msg_test)の両方がmsg_testを削除します。 msg_testを再利用するために、ループの最後にmsg_proto-> release_count()を試してみました。 – zjc