我有这个小的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删除给我?我在文档中找不到任何内容。
答案 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删除您的对象。