boost::serialization
私はクラスに使用します。私にはいくつかの継承があるのでBOOST_CLASS_EXPORT
、クラスを「登録」するために使用する必要があります。私が何も誤解しなかったことを望みます。
私はこのマクロを使用します:
BOOST_CLASS_EXPORT(MyClass)
または私もこれを使用します:
BOOST_CLASS_EXPORT_GUID(MyClass, "MyClass")
MyClassの定義も含まれているMyClass.hなどの1つのヘッダーファイル。ただし、マクロをソース(* .cpp)ファイルの1つに入れようとしても、再び失敗します。
の終わりにセグメンテーション違反が発生しmain()
ます。Stacktraceは、コールスタックがこの問題とほぼ同じであることを示しています。この問題の解決策や回避策が見つかりません。問題はデストラクタのせいだと思いますが、どうすれば解決できるのかわかりません。これが私のせいであるとか、ブーストのバグであるとさえ言えません。(自分で直せるのは私のせいだと思います)
これに対する解決策/回避策はありますか?そして、なぜ問題が発生するのですか?
私のビルド環境は、Ubuntu 10.04 64ビットサーバー(カーネル2.6.32)、gcc 4.4.3、ブースト1.40です。(私はそれを見つけて、バージョンを見るために/usr/include/boost/version.hpp
使用します)apt-cache show libboost-dev
-Wall -g3 -O0
コンパイラオプションとして使用しています。
不思議なことに、問題は私のマシンの1つでのみ発生します。CentOS(カーネル2.6.18)、gcc 4.1.2、およびBoost1.41を実行している別のマシンはうまくいきます。
更新:プロジェクト全体を小さな例にまとめます。それは底に置かれ、私の要点でも利用できます。クラスは何もしません、そして(私の)プログラムは何もしません。それにもかかわらず、BOOST_CLASS_EXPORT
セグメンテーション違反が発生します。
f1.cpp
またはを削除するf2.cpp
と、問題が解消されることに注意してください(複数のコンパイルユニットが必要です)。同様の状態がとで発生しclass A/A_child
ますB/B_child
。1つのクラスだけで問題が発生しない理由がわかりません。
コード
コンパイル
g++ -Wall -g3 -O0 -o program main.cpp f1.cpp f2.cpp -lboost_serialization
f1.cpp
#include "MyClass.h"
f2.cpp(f1.cppと同じ)
#include "MyClass.h"
main.cpp
int main(int argc, char *argv[])
{
}
MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <boost/serialization/export.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
class A
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
}
};
class A_child: public A
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object<A>(*this);
}
};
BOOST_CLASS_EXPORT(A_child)
class B
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
}
};
class B_child: public B
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object<B>(*this);
}
};
BOOST_CLASS_EXPORT(B_child)
#endif