1

統合/モバイルプラットフォーム用のC++ライブラリを構築しようとしています。プラットフォームには、stdc++を含む適切なライブラリのセットがあります。私が構築しようとしているライブラリはofstreamを使用しており、ofstreamに依存するクラスを使用しようとすると、「bad_cast」例外が発生します。

0  0xb082d9b1 in SignalKill ()
   from /home/preet/bbndk-2.0.1/target/qnx6/x86/lib/libc.so.3

1  0xb081aa7e in raise ()
   from /home/preet/bbndk-2.0.1/target/qnx6/x86/lib/libc.so.3

2  0xb0818cb8 in abort ()
   from /home/preet/bbndk-2.0.1/target/qnx6/x86/lib/libc.so.3

3  0xb87c48bf in __gnu_cxx::__verbose_terminate_handler ()
    at ../../../../../libstdc++-v3/libsupc++/vterminate.cc:93

4  0xb87c23d6 in __cxxabiv1::__terminate (
    handler=0xb87c47c0 <__gnu_cxx::__verbose_terminate_handler()>)
    at ../../../../../libstdc++-v3/libsupc++/eh_terminate.cc:38

5  0xb87c2421 in std::terminate ()
    at ../../../../../libstdc++-v3/libsupc++/eh_terminate.cc:48

6  0xb87c2563 in __cxxabiv1::__cxa_throw (obj=0x859e710, tinfo=0xb87f4c24, 
    dest=0xb87c0670 <std::bad_cast::~bad_cast()>)
    at ../../../../../libstdc++-v3/libsupc++/eh_throw.cc:83

7  0xb875e88c in std::__throw_bad_cast ()
    at ../../../../../libstdc++-v3/src/functexcept.cc:52

8  0xb8798c0d in __check_facet<std::ctype<char> > (__f=<optimized out>)
    at /home/builder/hudson/650-gcc-4.4/svn/linux-x86-o-ntox86/i486-pc-nto-qnx6.5.0/pic/libstdc++-v3/include/bits/basic_ios.h:49

9  widen (__c=<optimized out>, this=<optimized out>)
    at /home/builder/hudson/650-gcc-4.4/svn/linux-x86-o-ntox86/i486-pc-nto-qnx6.5.0/pic/libstdc++-v3/include/bits/basic_ios.h:440

10 std::endl<char, std::char_traits<char> > (__os=...)
    at /home/builder/hudson/650-gcc-4.4/svn/linux-x86-o-ntox86/i486-pc-nto-qnx6.5.0/pic/libstdc++-v3/include/ostream:539

11 0xb8793c2d in std::ostream::operator<< (this=0x84db220, 
    __pf=0x804f64c <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@plt>)
    at /home/builder/hudson/650-gcc-4.4/svn/linux-x86-o-ntox86/i486-pc-nto-qnx6.5.0/pic/libstdc++-v3/include/ostream:113

12 0x0805240d in QDecViewport::QDecViewport (this=0x86da6c0, parent=0x0)
    at ../qml_osg_viewport/qdecviewport.cpp:12

13 0x08051cca in QDeclarativePrivate::QDeclarativeElement<QDecViewport>::QDeclarativeElement (this=0x86da6c0)
    at /usr/local/Trolltech/QtLighthouse-4.8.2-i386/include/QtDeclarative/qdeclarativeprivate.h:83

14 0x08051d3c in QDeclarativePrivate::createInto<QDecViewport> (
    memory=0x86da6c0)
    at /usr/local/Trolltech/QtLighthouse-4.8.2-i386/include/QtDeclarative/qdeclarativeprivate.h:91

15 0xb8ad5ec5 in ?? ()

16 0x086da6c0 in ?? ()

17 0x00000000 in ?? ()

フレーム7-11は関連性があり、理解するのに役立つ必要があります。フレーム12が参照している行は次のとおりです。

OSG_INFO << "Hello OSG" << std::endl;

ここで、OSG_INFOは、ロギングに使用されるストリームリダイレクタです。std::coutを同じように問題なく使用できます。フレーム11を解くと、次のようになります。

__pf=0x804f64c <std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)@plt>)

これはまだかなり不可解です...そして、おそらく私が本当に奇妙なものをofstream出力演算子に渡そうとしていたとしたら、物事がおかしくなることを理解しますが、それは単なるテキストです。誰か提案はありますか?

4

1 に答える 1

4

std::endlC++11§27.7.3.8/1を引用して、次の動作をします。

を呼び出しos.put(os.widen('\n'))、次にos.flush()

フレーム9は、endlへの呼び出しwidenが失敗している、つまり失敗していることを示していOSG_INFO.widen('\n')ます。widen次に、次の動作をします(§27.5.5.3/ 12):

戻り値: use_facet< ctype<char_type> >(getloc()).widen(c)

use_facetbad_castファセットが埋め込まれたロケール(§22.3.2/ 3)に存在しない場合、それ自体がスローされますが、スタックトレースはこれが当てはまることを示していません。(それから、私はlibstdc ++の内部を掘り下げて、それが本によって物事を行っていることを確認していません...)

私はそれ__check_facetが以前に呼び出されたuse_facet(またはuse_facetスタックトレースからインライン化されて消えた)と思いますが、同じ正味の効果があります。これOSG_INFOは、ファセットが存在しないロケールが染み込んでいることを意味しますstd::ctype<char>–悪い時期です!

または、単に正常に処理されないファセットが存在するロケールが含まれている可能性がありますwiden('\n')OSG_INFOしかし、それが何であるか、および/またはそれがどのように実装されているかを知らなければ、確実に知る方法はなく、他に何も言えません。

于 2012-05-31T22:53:09.810 に答える