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

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

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

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

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

Метод 1:

oPerson.set_allocated_profile(pProfile.get());

Метод 2:

oPerson.set_allocated_profile(&*pProfile);

person CMouse    schedule 20.04.2017    source источник
comment
Трудно помочь без дополнительного контекста: просмотрите свои пределы срока службы и убедитесь, что память все еще действительна, когда она используется.   -  person Marco A.    schedule 20.04.2017


Ответы (1)


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

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

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

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

Iff set_allocated_profile не принимает на себя ответственность, я бы предпочел написать:

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

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

*oPerson.mutable_profile() = *pProfile;
person sehe    schedule 20.04.2017