发送varint而不删除CodedOutputStream,ZeroCopyOutputStream

时间:2011-06-06 06:46:30

标签: c++ protocol-buffers

我的应用程序多次发送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()之后调用。停止

当我使用注释掉的代码部分而不是相应的代码时,一切正常。

1 个答案:

答案 0 :(得分:0)

您不必在堆上分配CodedOutputStream,您只需将其声明为您需要它的本地变量(或类成员)。它看起来并不像构造函数特别贵。

您是否一直在写同一个文件?如果是这样,您可以使用单个CodedOuputStream和FileOutputStream进行所有写入。