c++ Protobuf:set_allocated_* 是否会删除已分配的对象?

nzkunb0c  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(293)

我有这个小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会帮我删除它?我在文档中找不到任何东西。

mlnl4t2r

mlnl4t2r1#

自从问了这个问题,我一直在继续寻找答案。也许别人也对答案感兴趣。
从这里:https://developers.google.com/protocol-buffers/docs/reference/cpp-generated
void设置分配的foo(字符串 * 值):将字符串对象设置为字段,如果存在,则释放先前的字段值。如果字符串指针不为NULL,则消息获得分配的字符串对象的所有权,has_foo()将返回true。否则,如果值为NULL,则行为与调用clear_foo()相同。string*
release_foo():释放字段的所有权,返回字符串对象的指针。调用this后,caller获得分配的字符串对象的所有权,has_foo()返回false,foo()返回默认值。
这意味着:只要你调用release_*,protobuf就会负责删除对象。如果你在处理完Protobuf Message后还需要Object,你需要使用release_*释放它,这会阻止Protobuf删除你的对象。

相关问题