msgdataを削除するのはいつ安全ですか? unpack()の後に? Tに変換後?
あなたがmsgpack::unpack()
機能を使用する場合は、行動を開梱デフォルトはコピーです。だからmsgpack::unpack()
の後にmsgdata
を破壊することができます。
はあなたがコピーの動作をカスタマイズすることができmemory management
を参照してください。あなたはmsgpack::unpack()
にunpack_reference_func
ハンドラを渡すと、ハンドラが戻ったとき真、msgpack::unpacked
はmsgdata
を参照する場合があります。参照状況はreferenced
パラメータで確認できます。 reference
パラメータがの場合、の場合、msgpack::unpacked
はmsgdata
となります。
void unpack(
object_handle& result,
const char* data,
std::size_t len,
bool& referenced, // actual status for reference
unpack_reference_func f = nullptr, // customize copy/reference behavior
void* user_data = nullptr,
unpack_limit const& limit = unpack_limit());
厳密に言えば、msgpack::unpacked
直接、msgpack::unpacked
によって保持されているmsgpack::object
がmsgdata
指すmsgdata
を指すものではありません。
いつmsgunpackedを削除しても安全ですか? get()の後に?
はaccessing unpacked data
get()
がmsgpack::object
を取得するためのメンバ関数である参照してください。 msgpack::object
は、一種のメモリプールであるmsgpack::zone
にあります。 msgpack::unpacked
にはstd::unique_ptr<msgpack::zone>
が含まれています。つまり、msgpack::object
にアクセスしている間にmsgunpacked
の生存期間を維持する必要があることを意味します。これはget()
によって取得されます。 msgpack::object
からTに変換し、Tがmsgpack::object
を参照しておらず、msgpack::object
にアクセスしていない場合は、msgunpacked
を破棄することができます。私はTがmsgpack::object
を参照していないと言った。それはTのタイプに依存する。ほとんどのタイプはmsgpack::object
を参照していません。 msgpack::type::raw_ref
,boost::string_ref
およびmsgpack::type::variant_ref
はmsgpack::object
を意味する。
これらのタイプに変換する場合は、寿命をmsgpack::object
にする必要があります。
はconversionは、adaptor、variant_ref
私は削除したり、無料のparamsする必要はありますか?
No. Tはスタック上にありますので、解放する必要はありません。 Tはstd::vector<sometype>
などのように、ヒープ上のデータが含まれている場合、データはT.
のデストラクタによって解放されなければならないと私はmsgpack ::タイプのようなメンバーを破壊する必要があります:: raw_ref明示的に?
いいえ、あなたはmsgpack::type::raw_ref
を解放する必要はありません。これは単なる参照型オブジェクトです。 msgpack::type::raw_ref
によって参照されるメモリは、msgunpacked
が解放されると解放されます。
これは素晴らしいです。 Takatoshiありがとう! – sebf