問題を再現する簡単なプログラムを作成しました。
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/tuple/tuple.hpp>
#include <sstream>
#include <iostream>
template<typename T>
std::string serialize(const T & value)
{
std::ostringstream oss;
boost::archive::text_oarchive oa(oss);
oa << value;
return oss.str();
}
template<typename T>
T deserialize(const std::string & buffer)
{
std::istringstream iss(buffer);
boost::archive::text_iarchive ia(iss);
T ret;
ia >> ret;
return ret;
}
struct MyClass
{
MyClass() {}
MyClass(const std::string & name) : name(name) {}
template<class Archive>
void serialize(Archive & ar, const unsigned int)
{
ar & name;
}
std::string name;
};
int main()
{
MyClass myClass("Test");
std::string serialized = serialize(myClass);
std::cout << "Serialized: " << serialized << std::endl;
MyClass deserialized = deserialize<MyClass>(serialized);
std::cout << "Name after deserialization: " << deserialized.name << std::endl;
}
コードは正常にコンパイルされますが、実行時に次のエラーが発生します。
Serialized: 22 serialization::archive 9 0 0 4 Test
test(74010) malloc: *** error for object 0x109bf55e0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
name
デバッガーでは、boostが変数を逆シリアル化しようとしたときにエラーが発生することがわかります。
誰かが私が間違っていることを理解するのを手伝ってもらえますか?
アップデート
私はMacOSX Lionを使用しており、GCC 4.6.2(g++-mp-4.6 (GCC) 4.6.2
)とブーストバージョン1.48を使用しています。どちらもMacPorts経由でインストールされます。
コマンドラインは次のとおりです。
g++ -o test -I/opt/local/include -L/opt/local/lib main.cpp -lboost_serialization
ここでSubversionからコードをチェックアウトできます:http ://stacked-crooked.googlecode.com/svn/trunk/Playground/Serialization 。
アップデート
Linux GCC 4.6.1とブースト1.48でテストしましたが、正常に動作します。それはどういうわけかMacでの私の設定に固有の問題であるに違いありません。