【发布时间】: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