2

我必须通过一个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 构建的库函数,指针超出范围导致分段错误。

方法一:

oPerson.set_allocated_profile(pProfile.get());

方法二:

oPerson.set_allocated_profile(&*pProfile);
4

1 回答 1

3

方法 1 和 2 是等效的,因为 Protobuf 消息不会重载operator&

Protobuf 在内部管理生命周期(我认为是 Copy-On-Write 语义),因此我更倾向于始终使用值语义。

我从不完全确定所有权是否(以及如何)与分配的设置器(set_allocated_*)一起转移。如果您找到记录它的来源,请告诉我!

IFF set_allocated_profile获得指针的所有权,那么您的两种方法都不正确。您需要从您拥有的共享指针中释放指针(请参阅如何从 boost::shared_ptr 释放指针?)。

IFF set_allocated_profile没有所有权,更愿意写:

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

或等效地:

*oPerson.mutable_profile() = *pProfile;
于 2017-04-20T09:11:55.570 回答