Как передать указатель 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;