Zunächst einmal bin ich nicht sehr erfahren mit C++, also vielleicht beaufsichtige ich etwas hier. Ich versuche, Nachrichten von Proto-Dateien mit dem folgenden Code dynamisch zu generieren protobuf:Dynamisch generieren Protobuf-Nachricht und einen Zeiger darauf zurück
int init_msg(const std::string & filename, protobuf::Arena* arena, protobuf::Message** new_msg){
using namespace google::protobuf;
using namespace google::protobuf::compiler;
DiskSourceTree source_tree;
source_tree.MapPath("file", filename);
MuFiErCo error_mist;
Importer imp(&source_tree, &error_mist);
printf("Lade Datei:%s \n", filename.c_str());
const FileDescriptor* f_desc = imp.Import("file");
const Descriptor* desc = f_desc->FindMessageTypeByName("TestNachricht");
const Message* new_msg_proto = dmf.GetPrototype(desc);
*new_msg = new_msg_proto->New(arena);
//Debug
cout << (*new_msg)->GetTypeName() << endl;
return 0;
}
int main(int argc, char* argv[]){
protobuf::Arena arena;
protobuf::Message *adr2, *adr1;
init_msg("schema-1.proto", &arena, &adr1);
init_msg("schema-1.proto", &arena, &adr2);
printf("MSG_Pointer: %p, %p\n", adr1, adr2);
cout << adr1->GetTypeName() << endl;
arena.Reset();
return 0;
}
Ich dachte, wenn ich Arena verwenden, die neue Nachricht nicht in den Anwendungsbereich der Funktion ist ebenfalls verfügbar. Aber es gibt immer einen segfault, wenn ich versuche, auf die Nachricht zuzugreifen. Ich denke, es ist ein einfacher Fehler, aber ich konnte nicht herausfinden, wie man das löst. Hier
ist der Ausgang:
Lade Datei:schema-1.proto
packet.TestNachricht
Lade Datei:schema-1.proto
packet.TestNachricht
MSG_Pointer: 0x1b293b0, 0x1b287f0
Speicherzugriffsfehler (Speicherabzug geschrieben)
Das Problem, ich glaube, ist, dass 'FileDescriptor' et al, wenn' init_msg' kehrt zerstört werden, ohne die Möglichkeit, die neu erstellte Nachricht zu hinterlassen ihre .proto abzufragen Definition. Sie müssten 'Importer'-Instanz nach' main' verschieben und am Leben erhalten. Das hat nichts mit Arenen zu tun. –
Das war die Lösung, ich werde später ein funktionierendes Codebeispiel bereitstellen. Vielen Dank! – LoopingLouie