2017-04-07 88 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_ *'。非常感謝。 –