当使用带有子消息的协议缓冲区时,我遇到了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(),复制构造函数等设置它,...我仍然遇到同样的问题
答案 0 :(得分:0)
我认为函数createMessage()中的var msg在函数返回后被销毁并解除分配。
您应该尝试使用msg作为主类的属性。