2

ブーストを使用してオブジェクトをシリアライズしようとしているときに奇妙なクラッシュが発生しました。興味深いことに、この問題は、プロジェクトをリリース モードでコンパイルした場合にのみ発生します。デバッグ モードでは、すべて正常に動作し、XML ファイルは正しく書き込まれます。

シリアル化されるはずのクラスのコードを次に示します。メンバ変数「weights」は、オブジェクトの構築中に動的に割り当てられる配列へのポインタです。

[...]
private:
[...]
int     numOrientations;
int     numScales;
float   thresh;
float*  weights;    

friend class boost::serialization::access;
template<class archive> void serialize(archive& ar, const unsigned int version)
{
    using boost::serialization::make_nvp;
    using boost::serialization::make_array;
    ar & make_nvp("numOrient", numOrientations);
    ar & make_nvp("numScales", numScales);
    ar & make_nvp("thresh", thresh);
    ar & make_nvp("weights", make_array(weights, numScales*4 + 1));
}

全体は次のように呼び出されます。

std::fstream mpbcstr("test.xml", std::fstream::trunc | std::fstream::out);
boost::archive::xml_oarchive xml(mpbcstr);
      <-- program executes fine until here
xml << boost::serialization::make_nvp("gpbconfig", configg);
      <-- is not reached
mpbcstr.close();

すべてがデバッグモードで正常に動作するため。すべての行の後にデバッグステートメントを出力して、エラーの場所を突き止めようとしました。コードがクラッシュする上記のコードの行にマークを付けました。面白いことに、シリアライゼーション関数では、クラッシュの前に最初の行さえも実行されません。

私が得ているエラーは次のとおりです。

  First-chance exception at 0x000000013f4c31cd in rungpb.exe: 0xC0000005: Access violation reading location 0x000000003d4ccccd.

まったく役に立たないことはわかっています。問題が発生する可能性のある提案は大歓迎です。

4

0 に答える 0