web-dev-qa-db-fra.com

Protobuf: set_allocated_ * supprimera-t-il l'objet alloué?

J'ai ce petit code protobuf (simplifié, seul le nécessaire est contenu):

message ParamsMessage {
    required int32 temperature = 1;
}

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

    optional ParamsMessage paramsMessage = 2;

}

Je crée maintenant un MasterMessage de la manière suivante:

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

La question est: Dois-je (après avoir traité le message) supprimer le message params, ou protobuf le supprimera-t-il pour moi? Je ne trouve rien dans les documents.

25
Nidhoegger

Depuis que j'ai posé la question, j'ai continué à trouver la réponse. Peut-être que quelqu'un est également intéressé par la réponse.

À partir d'ici: https://developers.google.com/protocol-buffers/docs/reference/cpp-generated

void set_allocated_foo (string * value): définit l'objet chaîne sur le champ et libère la valeur de champ précédente si elle existe. Si le pointeur de chaîne n'est pas NULL, le message devient propriétaire de l'objet chaîne alloué et has_foo () renvoie true. Sinon, si la valeur est NULL, le comportement est identique à l'appel de clear_foo (). chaîne*

release_foo (): Libère la propriété du champ et retourne le pointeur de l'objet chaîne. Après avoir appelé cela, l'appelant prend la propriété de l'objet chaîne alloué, has_foo () renverra false et foo () renverra la valeur par défaut.

Ce qui signifie: tant que vous le faites pas appelez release_*, protobuf se chargera de supprimer l'objet. Si vous avez besoin de l'objet après avoir traité le message Protobuf, vous devez le relayer en utilisant release_*, ce qui empêchera Protobuf de supprimer votre objet.

43
Nidhoegger