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

时间:2017-04-07 02:51:13

标签: c++ memory-management memory-leaks protocol-buffers

我有简单的信息:

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一起自动删除,因为我没有调用value.release_smallValue();

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

谢谢!

1 个答案:

答案 0 :(得分:3)

通常最好避免使用set|grep: PARAM=([0]="Jim's") # just an apostrophe ^ declare -p: declare -a PARAM='([0]="Jim'\''s")' # a bit uglier, in my opinion ^^^^ set_allocated_*方法;那些提供了您不应该需要的高级内存管理功能,除非您真的想要优化一些性能关键代码。

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

release_*