2017-04-07 90 views
0

我有简单的信息:我是否需要删除传递给google协议缓冲区(protobuf)的对象?

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()是OK不要叫delete &value;因为我没有经过创建new指针?
2. smallValue的记忆会自动删除value,因为我没有拨打value.release_smallValue();

//我是C++以及protobuf的新手。请确定我的代码是否有些奇怪。

谢谢!

+0

我会感到惊讶,如果谷歌有这样做的内存管理怪异的库。我希望你必须自己管理记忆。也就是说,你只能删除通过'new'分配的指针。 'value'不是通过'new'分配的;它被分配在堆栈上。 OTOH你应该(几乎)不必显式地键入'new'或'delete';你应该使用'std :: unique_ptr'和'std :: make_unique' – Justin

+0

@Justin感谢您对'std :: unique_ptr'和'std :: make_unique'的引用。我会研究它。 –

回答

2

通常最好避免使用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); 
+0

感谢您的建议!我将改为'mutable_ *'而不是'new'和'set_allocated_ *',但'release_ *'部分不是我的改变。这意味着'release_ *'将在使用消息后被调用。这不会导致内存泄漏,因为protobuf释放指针的所有权,我没有删除它? –

+0

是的,如果您调用release,那么您必须自己删除指针以避免内存泄漏。也许调用'release_value()'的代码实际上应该调用'clear_value()'? –

+0

伟大的一点!它实际上是'clear_ *'而不是'release_ *'。非常感谢。 –