Ошибка сегментации с использованием 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());
но я не знаю точно, что? Моя цель - установить сообщение Сообщение от уже созданного сообщения жены.
1 ответ
Когда вы звоните set_allocated_X
в protobuf вы передаете право собственности.
Вы не должны получить доступ к этому типу через w_msg
после звонка set_allocated_wife(...)
,
Вы не должны использовать общий указатель для построенного 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;
}
Вы дали Пол как MALE
за wife
, Вот почему это дало ошибку сегментации