我正在尝试为集成/移动平台构建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输出运算符,那我会理解事情变得疯狂,但这只是文本。有没有人有什么建议?

最佳答案

std::endl具有以下行为,引用了C++ 11§27.7.3.8/ 1:



第9帧表示endlwiden的调用失败,即OSG_INFO.widen('\n')失败。 widen依次具有以下行为(第27.5.5.3/12节):



如果该构面不存在于注入(inject)的区域设置中,则use_facet本身将引发bad_cast(第22.3.2 / 3节),但是您的堆栈跟踪并不表明是这种情况。 (再说一次,我没有深入研究libstdc++的内部内容,以验证本书是否在做事...)

我假设__check_facetuse_facet之前被调用(或者use_facet被内联并且从堆栈跟踪中消失了),并且具有相同的净效果。这意味着OSG_INFO充满了某些没有std::ctype<char>构面的语言环境-糟糕的时机!

另外,它可能充满了某些语言环境,而这些语言环境根本无法很好地处理widen('\n')。但是无法确定,而且在不知道OSG_INFO是什么和/或如何实现的情况下,我们无法告诉您其他任何信息。

07-28 13:24