我的应用程序多次发送varints。每次我必须为2个objetcs分配内存:CodedOutputStream和FileOutputStream,然后将其释放。 IMO是不必要的时间损失。如何在没有这个过程的情况下发送varint? (我不想手动但是使用protobuf)
我找到了它:
delete coded_output;
/* delete raw_output;*/
((FileOutputStream*)raw_output)->Flush();
但每次都有一个对象要分配
void Connection::send(const Message& msg) throw(EmptyMessage) {
//CodedOutputStream* coded_output = new CodedOutputStream(raw_output);
CodedOutputStream coded_output(raw_output);
int n = msg.ByteSize();
if(n<=0) throw EmptyMessage();
//coded_output->WriteVarint32(n);
coded_output.WriteVarint32(n);
//delete coded_output;
coded_output.~CodedOutputStream();
raw_output->Flush();
msg.SerializeToArray(buffer, n);
SocketMaintenance::write(buffer, n);
}
Annoucement Connection::receive() throw(EmptySocket) {
//CodedInputStream* coded_input = new CodedInputStream(raw_input);
CodedInputStream coded_input(raw_input);
google::protobuf::uint32 n;
//coded_input->ReadVarint32(&n);
coded_input.ReadVarint32(&n);
char *b;
int m;
//coded_input->GetDirectBufferPointer((const void**)&b, &m);
coded_input.GetDirectBufferPointer((const void**)&b, &m);
Annoucement ann;
ann.ParseFromArray(b, n);
return ann;
}
当我使用上面的代码时,我从客户端应用程序中获得此错误(运行时错误)(此应用程序仅使用send函数):
libprotobuf致命 谷歌/ protobuf的/ IO / zero_copy_stream_impl_lite.cc:346] 检查失败:(buffer_used_)== (buffer_size_):BackUp()只能是 在Next()之后调用。终止被叫 投掷一个实例后 '谷歌:: protobuf的:: FatalException'
what():CHECK失败:(buffer_used_) ==(buffer_size_):BackUp()只能在Next()之后调用。停止
当我使用注释掉的代码部分而不是相应的代码时,一切正常。
答案 0 :(得分:0)
您不必在堆上分配CodedOutputStream,您只需将其声明为您需要它的本地变量(或类成员)。它看起来并不像构造函数特别贵。
您是否一直在写同一个文件?如果是这样,您可以使用单个CodedOuputStream和FileOutputStream进行所有写入。