使用protobuf分割错误

时间:2018-11-18 23:31:14

标签: c++ protocol-buffers

我已经开始学习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());中做错了什么,但我不知道到底是什么?我的目的是从已创建的妻子消息中设置消息消息。

2 个答案:

答案 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。这就是为什么它会带来细分错误