【问题标题】:What could make dynamic_cast start throwing std:bad_cast even if invoked on pointers?即使在指针上调用,什么会使 dynamic_cast 开始抛出 std:bad_cast ?
【发布时间】:2017-08-23 15:32:04
【问题描述】:

我遇到了一种非常奇怪的行为。无法隔离 MCVE 中的问题,但当我进行调查时会。

我有一个基于 CPPUNIT 库和 Qt 的程序,可以运行大约 900 个单元测试。该程序使用 QtCreator 部署在 Android 上。它与大约 80 个库链接,每个库都定义了一些测试。

在 PC 上,程序可以完美运行。在 Android 上部署时,当我运行它时,在运行了一些测试 (~100) 之后,我开始在我的测试中为每个 dynamic_castdone 收到 std::bad_cast 异常。我看到它来自我在指针上调用 dynamic_cast 的地方,而不是在引用上。根据doc,只有在引用dynamic_cast 时才会抛出std::bad_cast...

void validate( ParentTestHelper& testHelper )
{
    const ChildTestHelper* child = dynamic_cast<const ChildTestHelper*>( &testHelper );
    ...
}

但是,我的代码抛出 std::bad_cast

如果我只运行dynamic_cast 的测试,它可以工作。只有在其他人之后运行它才会失败......并且手动运行它们不会让我重现问题。一定有什么奇怪的地方导致了这个问题,我还在调查。

如果有人知道为什么在指针上调用 dynamic_cast 会抛出 std::bad_cast,这可能会有所帮助...

【问题讨论】:

  • 这在标准 C++ 中不会发生。要么您的实现存在错误(可能性不大,但可能发生),或者您的测试以某种方式被破坏。
  • 由于您的目标是Android,您是否尝试过切换到other runtimes 看看是否有问题?
  • @BaummitAugen:希望我能找出问题所在,并能够回答我自己的问题。可能第三方库对引用进行了 dynamic_cast 并且没有捕获异常......
  • 关于您的问题,dynamic_cast 不会将类型转换为指针。但是为了帮助你更多,你必须提供相关的细节,比如你怎么知道std::bad_cast是从你说的行中抛出的,那些dynamic_cast指向指针的行?因为我很难相信有一个糟糕的实现会那样做
  • 根据developer.android.com/ndk/downloads/revision_history.html,NDK r11 存在一个已知问题,即“Clang、x86、stlport_static 和高于-O0 的优化级别的组合导致使用 dynamic_cast 的测试失败。 " 你的测试环境是否符合条件?这已在 r12 和最新版本 r15c BTW 中修复。

标签: c++ c++11 exception android-ndk dynamic-cast


【解决方案1】:

经过大量调查,我发现问题的根本原因是我对std::cout 应用了自定义方面。在某些时候,它会在boost::posix_time::ptimeoperator&lt;&lt; 中执行use_facet 时使boost 代码抛出std::bad_cast

请参阅其他主题,希望有人能解释原因:Why imbue with boost::posix_time::time_facet on std::cout crashs my app?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2019-11-02
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多