Protobuf: Will set_allocated_* delete the allocated object?
C++Protocol BuffersC++ Problem Overview
I have this small protobuf code (simplified, only the necessary is contained):
message ParamsMessage {
required int32 temperature = 1;
}
message MasterMessage {
enum Type { GETPARAMS = 1; SENDPARAMS = 2;}
required Type type = 1;
optional ParamsMessage paramsMessage = 2;
}
I now create a MasterMessage in the following way:
ParamsMessage * params = new ParamsMessage();
params->set_temperature(22);
MasterMessage master;
master.set_type(MasterMessage::SENDPARAMS);
master.set_allocated_paramsmessage(params);
The question is: Do I have to (after dealing with the message) delete the params
Message, or will protobuf delete it for me? I cannot find anything in the docs.
C++ Solutions
Solution 1 - C++
Since asking the question I have continued to find the answer. Maybe someone is interested in the answer, too.
From here: https://developers.google.com/protocol-buffers/docs/reference/cpp-generated
> void set_allocated_foo(string* value): Sets the string object to the > field and frees the previous field value if it exists. If the string > pointer is not NULL, the message takes ownership of the allocated > string object and has_foo() will return true. Otherwise, if the value > is NULL, the behavior is the same as calling clear_foo(). string* > > release_foo(): Releases the ownership of the field and returns the > pointer of the string object. After calling this, caller takes the > ownership of the allocated string object, has_foo() will return false, > and foo() will return the default value.
Which means: As long as you do not call release_*
, protobuf will take care of deleting the object. If you need the Object after dealing with the Protobuf Message, you need to relase it using release_*
, which will prevent Protobuf to delete your object.