Подтвердить что ты не робот

Protobuf: Будет ли set_allocated_ * удалять выделенный объект?

У меня есть этот небольшой протобуф-код (упрощенный, только необходимый):

message ParamsMessage {
    required int32 temperature = 1;
}

message MasterMessage {
    enum Type { GETPARAMS = 1; SENDPARAMS = 2;}
    required Type type = 1;

    optional ParamsMessage paramsMessage = 2;

}

Теперь я создаю MasterMessage следующим образом:

ParamsMessage * params = new ParamsMessage();
params->set_temperature(22);
MasterMessage master;
master.set_type(MasterMessage::SENDPARAMS);
master.set_allocated_paramsmessage(params);

Вопрос в том: Должен ли я (после обращения к сообщению) удалить сообщение params, или protobuf удалить его для меня? Я не могу найти ничего в документах.

4b9b3361

Ответ 1

Поскольку я задал этот вопрос, я продолжал находить ответ. Может быть, кто-то тоже заинтересован в ответе.

Отсюда: https://developers.google.com/protocol-buffers/docs/reference/cpp-generated

void set_allocated_foo (string * value): Устанавливает строковый объект в поле и освобождает предыдущее значение поля, если оно существует. Если указатель строки не равен NULL, сообщение переходит в собственность выделенного строкового объекта, а has_foo() возвращает true. В противном случае, если значение равно NULL, поведение будет таким же, как вызов clear_foo(). строка *

release_foo(): освобождает право собственности на поле и возвращает указатель на строковый объект. После вызова этого вызова вызывающий объект переходит в собственность выделенного строкового объекта, has_foo() вернет false, а foo() вернет значение по умолчанию.

Это означает: до тех пор, пока вы не вызываете release_*, protobuf позаботится об удалении объекта. Если вам нужен объект после работы с сообщением Protobuf, вам нужно его release_* используя release_*, что не позволит Protobuf удалить ваш объект.