ошибка сегментации с использованием protobuf - PullRequest
0 голосов
/ 19 ноября 2018

Я начал изучать протобуф, поэтому, пожалуйста, будьте осторожны со мной.

Мой протофиль:

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 голосов
/ 21 марта 2019

Вы задали пол как MALE для wife.Вот почему это дало ошибку сегментации

0 голосов
/ 19 ноября 2018

Когда вы звоните set_allocated_X в protobuf, вы передаете владение .

. Вы не должны получать доступ к этому типу через w_msg после того, как позвоните set_allocated_wife(...).

* 1009.* Вы также не должны использовать общий указатель для созданного объекта wife, поскольку это предполагает, что владение контролируется (потенциально многими) shared_ptr s.

Вот некоторый код (основанный наваш), который работает должным образом и позволяет изменять 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...