まず最初に、私はC++での経験はあまりないので、ここで何かを監督しています。 私は、動的に次のコードで.protoファイルからいるProtobufメッセージを生成しようとしている:私はアリーナを使用する場合、新しいメッセージが関数の範囲外でも利用可能であると思っprotobufメッセージを動的に生成し、それにポインタを返します
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;
}
。 しかし、メッセージにアクセスしようとすると、常にセグメンテーションがあります。 それは単純なエラーだと思いますが、これを解決する方法を理解できませんでした。ここで
はouputを次のとおりです。
Lade Datei:schema-1.proto
packet.TestNachricht
Lade Datei:schema-1.proto
packet.TestNachricht
MSG_Pointer: 0x1b293b0, 0x1b287f0
Speicherzugriffsfehler (Speicherabzug geschrieben)
です定義。 'Importer'インスタンスを' main'に移動し、それを生き続ける必要があります。これはアリーナとは関係ありません。 –
それは解決策でしたが、後で動作するコード例を提供します。 ありがとうございます! – LoopingLouie