Protobuf: Will set_allocated_* delete the allocated object?

C++Protocol Buffers

C++ 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNidhoeggerView Question on Stackoverflow
Solution 1 - C++NidhoeggerView Answer on Stackoverflow