2016-12-30 8 views
0

私はMsgpack-cを使用しています。私には分かりませんが、このライブラリを使用しているときにメモリを正しく処理する方法があります。クイックスタートの例では、すべてをローカルで宣言しています。アプリケーションが終了したときに呼び出されるデストラクタに依存していると推測していますが、同じことに頼ることはできません。msgpack-cを使用するとき、何時をきれいにする必要がありますか?

は、次のことを取る:

msgpack::unpacked msgunpacked; 
    msgpack::unpack(&msgunpacked, msgdata, msglength); 
    T params = msgunpacked.get().as<T>(); 
    return params ; 

msgdataを削除することが安全である場合には? unpack()の後にTに変換したら?

msgunpackedを削除するのはいつ安全ですか?get()の後に?

deleteまたはfreeパラメータが必要ですか?msgpack::type::raw_refなどのメンバーを明示的に破棄する必要はありますか?

答えて

1

msgdataを削除するのはいつ安全ですか? unpack()の後に? Tに変換後?

あなたがmsgpack::unpack()機能を使用する場合は、行動を開梱デフォルトはコピーです。だからmsgpack::unpack()の後にmsgdataを破壊することができます。

はあなたがコピーの動作をカスタマイズすることができmemory management

を参照してください。あなたはmsgpack::unpack()unpack_reference_funcハンドラを渡すと、ハンドラが戻ったときmsgpack::unpackedmsgdataを参照する場合があります。参照状況はreferencedパラメータで確認できます。 referenceパラメータがの場合、の場合、msgpack::unpackedmsgdataとなります。

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::objectmsgdata指す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_refmsgpack::objectを意味する。

これらのタイプに変換する場合は、寿命をmsgpack::objectにする必要があります。

conversionは、adaptorvariant_ref

私は削除したり、無料のparamsする必要はありますか?

No. Tはスタック上にありますので、解放する必要はありません。 Tはstd::vector<sometype>などのように、ヒープ上のデータが含まれている場合、データはT.

のデストラクタによって解放されなければならないと私はmsgpack ::タイプのようなメンバーを破壊する必要があります:: raw_ref明示的に?

いいえ、あなたはmsgpack::type::raw_refを解放する必要はありません。これは単なる参照型オブジェクトです。 msgpack::type::raw_refによって参照されるメモリは、msgunpackedが解放されると解放されます。

+0

これは素晴らしいです。 Takatoshiありがとう! – sebf

関連する問題