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;
}