2

オブジェクトの生ポインタをシリアル化し、別のアプリケーションに送信しています。

逆シリアル化すると、別の生ポインタが得られます。これは、Boost::Serialization がこのポインターの背後にあるオブジェクトを内部的に構築していることを意味します。私は今、誰がオブジェクトの所有権を持っているのか、Boost がそのオブジェクトを削除するのか、それが不要になったのかを知りたいと思っています。

おそらく問題が何であるかをよりよく示すいくつかのコード:

void anyMethod()
{
    std::ifstream file("archiv.txt"); 
    boost::archive::text_iarchive ia(file); 
    AnyClass* object; 
    ia >> object; 
    //work with object
}

//Now what has happened to object?
//Is it deleted, cause it went out of scope?
//Do I have to delete it myself?
4

3 に答える 3

3

ポインターのシリアル化に関するドキュメントの私の理解は、所有権がアーカイブによって保持されるということです。「同じポインターオブジェクトを複数回ロードすると、作成されるオブジェクトは1つだけになり、元のポインター構成が複製されます」。これは、図書館が簿記を扱っていることを示している傾向があります。

さらに、アーカイブはdelete_created_pointersメソッドを提供します:「ポインタのロードによって作成されたすべてのオブジェクトを削除します。これは、ポインタがロードされているときにアーカイブのロードで例外が発生した場合に発生する可能性のあるメモリリークを回避するために使用できます」.

于 2010-11-08T07:59:06.480 に答える
0

この古い質問に答えてすみません。demoを試してみたところ、メモリ リークがあることがわかりました。デモでは、アーカイブを関数内のオブジェクト (内部でポインターを使用) に復元します。関数が戻るとアーカイブは破棄され、オブジェクトが返されます。割り当てられたメモリは、誰もクリーンアップしません。復元機能を何度も実行するようにデモを修正したところ、プロセスがますます多くのメモリを消費することがわかりました。したがって、割り当てられたメモリをクリーンアップする必要がある場合は、ポインターを介して手動でオブジェクトを削除するか、delete_created_pointers() を呼び出します。

于 2015-06-19T06:14:28.070 に答える
0

このコンテキストでなぜ合法なのかわかりません.IMOは(http://en.highscore.de/cpp/boost/serialization.htmlAnyClass* object;を見てください)オブジェクトを持っていて、何度も再利用する必要があります。このオブジェクト (ポインターではない) がスコープ外になると、削除されます。AnyClass

于 2010-11-08T07:43:07.783 に答える