Protobuf:set_allocated_ *会删除分配的对象吗?

时间:2015-11-27 15:57:42

标签: c++ protocol-buffers

我有这个小的protobuf代码(简化,只包含必要的内容):

message ParamsMessage {
    required int32 temperature = 1;
}

message MasterMessage {
    enum Type { GETPARAMS = 1; SENDPARAMS = 2;}
    required Type type = 1;

    optional ParamsMessage paramsMessage = 2;

}

我现在以下列方式创建一个MasterMessage:

ParamsMessage * params = new ParamsMessage();
params->set_temperature(22);
MasterMessage master;
master.set_type(MasterMessage::SENDPARAMS);
master.set_allocated_paramsmessage(params);

问题是:我是否必须(在处理消息后)删除params消息,还是将protobuf删除给我?我在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:39)

自问这个问题后,我一直在寻找答案。也许有人对答案感兴趣。

从这里开始:https://developers.google.com/protocol-buffers/docs/reference/cpp-generated

  

void set_allocated_foo(string * value):将字符串对象设置为   字段并释放前一个字段值(如果存在)。如果是字符串   指针不为NULL,消息取得已分配的所有权   string对象和has_foo()将返回true。否则,如果是值   为NULL,行为与调用clear_foo()相同。字符串*

     

release_foo():释放字段的所有权并返回   字符串对象的指针。在调用它之后,调用者接受了   所分配的字符串对象的所有权,has_foo()将返回false,   和foo()将返回默认值。

这意味着:只要您执行调用release_*,protobuf就会负责删除该对象。如果在处理Protobuf消息后需要Object,则需要使用release_*重新启动它,这将阻止Protobuf删除您的对象。