0

boost::multi_index_container を boost::serialization で使用しようとしています。ただし、オブジェクトへのポインターを要素として使用し、一意でない順序を使用すると、シリアル化されたコンテナーをロードするときにメモリ アクセス違反が発生します。一意の順序付けや、コンテナー要素としてポインターの代わりにオブジェクトを使用した場合にエラーが発生しないことは興味深いことです。

私のコードに問題があるのか​​、それともブースト ライブラリのバグなのか誰か教えてもらえますか?

説明されているエラーを生成する最小限の例を次に示します。

#include <boost/multi_index_container.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/set.hpp>
#include <boost/lexical_cast.hpp>

#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>

#include <fstream>

using namespace std;
using namespace boost::multi_index;


struct element {

    friend class boost::serialization::access;

    std::string member1;

    element( int num ) { member1 = boost::lexical_cast<string>( num ); }
    element() {}

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & member1;
    }
};

int main( int argc, const char *argv[] )
{

    typedef multi_index_container<element *, indexed_by<ordered_non_unique<member<element, std::string, &element::member1>>>>  TestSet;

    TestSet myset;

    srand( time (NULL ));
    for (int i = 0; i < 20; i++) {
        myset.insert(new element(rand()));  
    }

    // Write set
    ofstream os("test.bin");
    boost::archive::binary_oarchive boa(os);

    boa << myset;
    os.close();

    // Read set
    TestSet newset;
    ifstream is("test.bin");
    boost::archive::binary_iarchive bia(is);

    bia >> newset;

    return 0;
}
4

1 に答える 1

1

ofstream os("test.bin");次のようにする必要があります。 ofstream os("test.bin", ios::binary);

また:

ifstream is("test.bin");次のようにする必要があります。ifstream is("test.bin", ios::binary);

于 2013-03-20T16:35:48.830 に答える