Мое приложение отправляет варианты много раз. Каждый раз, когда мне нужно выделить память для 2 объектов: CodedOutputStream и FileOutputStream, а затем освободить его. ИМО это лишняя потеря времени. Как я могу отправить 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;
}
Когда я использую код выше, я получаю эту ошибку (ошибка времени выполнения) из своего клиентского приложения (это приложение использует только функцию отправки):
libprotobuf FATAL
Google / Protobuf / IO / zero_copy_stream_impl_lite.cc: 346]
ПРОВЕРИТЬ не удалось: (buffer_used_) ==
(buffer_size_): BackUp () может быть только
вызывается после Next (). прекратить называется
после броска экземпляра
'Google :: Protobuf :: FatalException'
что (): ПРОВЕРИТЬ не удалось: (buffer_used_)
== (buffer_size_): BackUp () может быть вызван только после Next (). Остановился
Когда я использую закомментированную часть кода вместо соответствующей, все работает нормально.