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*
。谢谢。