Как передать указатель boost::shared_ptr в функцию protobuf?

Я должен пройти boost::shared_ptr:

boost::shared_ptr<Protobuf::Person::Profile> pProfile =
      boost::make_shared<Protobuf::Person::Profile>();

который является указателем protobuf, на функцию protobuf oPerson.set_allocated_profile(pProfile) но oPerson.set_allocated() ожидает указатель на Protobuf::Person::Profile,

Я пробовал несколько способов, но я думаю, когда я пытаюсь преобразовать объект protobuf в JSON, используя pbjson::pb2Json это библиотечная функция, построенная на быстром json, указатель выходит из области видимости, вызывая ошибку сегментации.

Способ 1:

oPerson.set_allocated_profile(pProfile.get());

Способ 2:

oPerson.set_allocated_profile(&*pProfile);

1 ответ

Решение

Методы 1 и 2 эквивалентны, поскольку сообщения Protobuf не перегружаются operator&,

Protobuf управляет временем жизни (и я думаю, что семантика Copy-On-Write) внутренне, поэтому я бы предпочел семантику значения во всем.

Я никогда точно не уверен, передается ли (и как) право собственности с выделенными установщиками (set_allocated_*). Если вы найдете источник, который документирует это, пожалуйста, сообщите мне!

Ифф set_allocated_profile становится владельцем указателя, тогда ни один из ваших подходов не верен. Вам нужно освободить указатель от вашего собственного разделяемого указателя (см. Как освободить указатель от boost:: shared_ptr?).

Ифф set_allocated_profile не беру в собственность, я бы предпочел написать

oPerson.mutable_profile()->CopyFrom(*pProfile);

Или эквивалентно:

*oPerson.mutable_profile() = *pProfile;
Другие вопросы по тегам