Reflection AddMessage cause pure vritual method called and crash

83 views
Skip to first unread message

uni x

unread,
Sep 11, 2021, 11:33:08 PM9/11/21
to Protocol Buffers
I'm parsing message by runtime proto-file. I constructed "prototye message", and tried to get reflection infos of each fields. when it comes to nested message, I need to `AddMessage` to get the inside fields.

// proto-file
```
message A {
   int32  a1 = 1;
   string a2 = 2;
};
message B {
   repeated A b1 = 1;
   int64      b2 = 2;
};
```

```
Class ProtoType {
Message* msg;
BizX* biz_x;
void Init(const std::string& proto_file_path) {
    // parse from file to get msgDesc
    auto* factory = new google::protobuf::DynamicMessageFactory();
    factory->SetDelegateToGeneratedFactory(true);                                                                 
    msg= mFactory->GetPrototype(msgDesc);         
}
void InitRefl() {
    biz_x = new BizX();
    biz_x->Init(*(msg->New()));
}
};
```

```
class BizX {
BizY* biz_y;
Reflection* refl;
Descriptor* desc;
void Init(const Message& msg) {
    refl = msg.GetReflection();
    desc = msg.GetDescriptor();

    const auto* field_desc = desc->FindFieldByName("b1");
    auto* p = msg.New();
    auto* tmp = refl->AddMessage(p, field_desc);

    biz_y = new BizY();
    biz_y->Init(msg);
};
```

```
class BizY {
Reflection* refl;
Descriptor* desc;
void Init(const Message& msg) {
    refl = msg.GetReflection();
    desc = msg.GetDescriptor();

    const auto* field_desc = desc->FindFieldByName("b1");
    auto* p = msg.New();
    auto* tmp = refl->AddMessage(p, field_desc); // crash!!!:pure virtual method called
}
};
```

```
int main() {
    ProtoType* p = new ProtoType();
    p->Init("proto-file")
    p->InitRefl();
    return 0;
}
```

I thought `BizY::Init` should have the same result as `BizX::Init`, but it crashed, why?
Reply all
Reply to author
Forward
0 new messages