我是否需要删除传递给谷歌协议缓冲区(protobuf)的对象

Do I need to delete objects passed to google protocol buffer (protobuf)?

本文关键字:缓冲区 协议 protobuf 对象 谷歌 是否 删除      更新时间:2023-10-16

我有简单的消息:

message SmallValue {
    int32 val = 1;
}
message Value {
    int32 val1 = 1;
    int32 val2 = 2;
    SmallValue val3 = 3;
}
message SendMessage {
    int32 id = 1;
    oneof message {
        Value value= 2;
}

我的代码段:

// create new pointer for smallValue
SmallValue* smallValue = new SmallValue();
smallValue->set_val3(3);
// create new object value and set_allocated_val3
Value value;
value.set_val1(1);
value.set_val2(2);
value.set_allocated_val3(smallValue);
// create new object message and set_allocated_value
SendMessage message;
message.set_id(0);
message.set_allocated_value(&value);
// after some work, release value from message
message.release_value();

我的问题是:
1. 调用message.release_value()是否可以不调用delete &value;,因为我没有创建new指针?
2. smallValue的记忆会随着我没有打电话value.release_smallValue();value一起自动删除吗?

我是C++和protobuf的新手。请告诉我的代码是否有奇怪之处。

谢谢!

通常最好避免使用 set_allocated_*release_* 方法;它们提供了您不需要的高级内存管理功能,除非您真的试图优化一些性能关键型代码。

您可以像这样重写代码,以避免担心内存管理:

SendMessage message;
message.set_id(0);
Value* value = message.mutable_value();
value->set_val1(1);
value->set_val2(2);
value->mutable_val3()->set_val(3);