C++ 我需要删除传递到google协议缓冲区(protobuf)的对象吗?

C++ 我需要删除传递到google协议缓冲区(protobuf)的对象吗?,c++,memory-management,memory-leaks,protocol-buffers,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

我有一些简单的信息:

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.调用
消息后。释放\u value()
是否可以不调用
删除&value因为我没有创建
新的
指针?
2.
smallValue
的内存将与
value
一起自动删除,因为我没有调用
value.release_smallValue()

/我是C++的新手,也是原Buff.如果我的代码有什么奇怪的地方,请告诉我


谢谢

通常最好避免使用
set\u allocated\u*
release\u*
方法;这些提供了高级内存管理功能,您不应该需要这些功能,除非您真的试图优化一些性能关键的代码

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

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);

如果谷歌有一个让内存管理变得怪异的库,我会感到惊讶。我想你必须自己管理内存。也就是说,您只能
删除通过
new
分配的
指针<代码>值
不通过
新建
分配;它是在堆栈上分配的。o您应该(几乎)永远不必显式地键入
new
delete
;您应该使用
std::unique\u ptr
std::make\u unique
@Justin感谢您参考
std::unique\u ptr
std::make\u unique
。我会调查的。谢谢你的建议!我将更改为
mutable.*
而不是
new
set\u allocated.*
,但是
release.*
部分不是我要更改的。这意味着使用消息后将调用
release.*
。当protobuf释放指针的所有权而我没有删除它时,这不会导致内存泄漏吗?是的,如果调用release,则必须自己删除指针以避免内存泄漏。也许调用
release\u value()
的代码实际上应该调用
clear\u value()
?很好!它实际上是
clear\u*
而不是
release\u*
。谢谢。