我已经开始学习protobuf,所以请对我保持谨慎。
我的原型文件:
syntax = "proto3";
package apple;
message Message {
repeated int32 id = 1;
string name = 2;
wife mywife = 3;
enum phonetype
{
INVALID = 0;
MOBILE = 1;
HOME = 2;
}
phonetype type = 4;
}
message wife
{
string her_name = 1;
int32 age = 2;
enum sex
{
INVALID = 0;
FEMALE =1;
MALE=2;
}
sex orient = 3;
}
我的C ++文件:
using namespace google::protobuf;
using namespace std;
int main(int argc, char const *argv[]) {
apple::Message msg;
msg.add_id(77);
msg.set_name("xyz");
auto w_msg = make_shared<apple::wife>();
w_msg->set_her_name("abc");
w_msg->set_age(88);
w_msg->set_orient(apple::wife::MALE);
msg.set_allocated_mywife(w_msg.get());
cout << w_msg->her_name();
return 0;
}
该程序可以编译并正常运行,但是当我运行该程序时,我遇到了一个分段错误,使用Valgrind运行时会给我一个无效的读取错误,并带有太多我无法理解的信息。我假设我在msg.set_allocated_mywife(w_msg.get());
中做错了什么,但我不知道到底是什么?我的目的是从已创建的妻子消息中设置消息消息。
答案 0 :(得分:3)
在protobuf中呼叫set_allocated_X
时,您转让所有权。
致电w_msg
后,您不应通过set_allocated_wife(...)
访问该类型。
也不要对构造的wife
对象使用共享指针,因为这假定所有权是由(可能有许多)shared_ptr
控制的。
这是一些代码(基于您的代码),可以正常运行,并且仍然允许您修改wife
。
int main(int argc, char const *argv[]) {
apple::Message msg;
msg.add_id(77);
msg.set_name("xyz");
auto w_msg = make_unqiue<apple::wife>();
w_msg->set_her_name("abc");
w_msg->set_age(88);
w_msg->set_orient(apple::wife::MALE);
msg.set_allocated_mywife(w_msg.release());
cout << msg.mywife().her_name() << '\n';
auto* modifyable_wife = msg.mutable_mywife();
modifyable_wife->set_her_name("abc");
cout << msg.mywife().her_name() << '\n';
return 0;
}
答案 1 :(得分:-3)
您将MALE
的性别设为wife
。这就是为什么它会带来细分错误