设置Protobuf子消息或嵌入消息并返回消息对象

时间:2015-04-29 11:31:23

标签: c++ protocol-buffers

当使用带有子消息的协议缓冲区时,我遇到了Segfault。我无法发布所有代码,因此我尝试举例说明。

.proto代码是这样的:

Message {
    optional int id = 1;
    optional SubMessage submsg = 2;
}

SubMessage {
    optional int foo = 1;
}

在C ++代码中,我有一个函数创建并将SubMessage返回给另一个函数,该函数将SubMessage嵌入到Message中并将该函数返回给另一个函数,...

SubMessage createSubMessage() {
    SubMessage smsg;
    smsg.set_foo(12);
    return smsg;
}

Message createMessage() {
    Message msg;
    // with this line i get the segfault, without not
    SubMessage* smsg = msg.mutable_submsg();
    // I get the segfault no matter if i actually
    // set the submessage or not. 
    // smsg.CopyFrom(createSubMessage();
    return msg;
}

void foo() {
    for(;;) {
        Message msg;
        msg = createMessage();
   }
}

我得到的错误来自SubMessage :: MergeFrom()

[libprotobuf FATAL messges_pb.cc:1128] CHECK failed: (&from) != (this): 
Segmentation fault

Segfault有趣地出现在循环的第二次迭代中,第二次分配给msg。

我已经尝试了很多模糊测试,在堆上分配SubMessage并使用set_allocated_submsg(),CopyFrom(),MergeFrom(),复制构造函数等设置它,...我仍然遇到同样的问题

1 个答案:

答案 0 :(得分:0)

我认为函数createMessage()中的var msg在函数返回后被销毁并解除分配。

您应该尝试使用msg作为主类的属性。