web-dev-qa-db-ja.com

Protobuf:set_allocated_ *は割り当てられたオブジェクトを削除しますか?

私はこの小さなprotobufコードを持っています(単純化され、必要なものだけが含まれています):

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がそれを削除しますか?ドキュメントに何も見つかりません。

25
Nidhoegger

質問をして以来、私は答えを見つけ続けました。誰かも答えに興味があるかもしれません。

ここから: 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()はデフォルト値を返します。

つまり:notcall release_*を実行する限り、protobufはオブジェクトの削除を処理します。 Protobufメッセージを処理した後にオブジェクトが必要な場合は、release_*を使用してリリースする必要があります。これにより、Protobufがオブジェクトを削除できなくなります。

43
Nidhoegger