当使用指针时,dynamic_cast会抛出异常吗?

时间:2013-05-10 06:42:50

标签: c++ dynamic-cast

我在我的源代码中使用dynamic_cast来将指针转换为下面的内容,

Base *base = here storing the pointer;

Derived *derived = dynamic_cast<Derived*>(base);

如果base没有类层次结构的指针,则强制转换失败并返回NULL。在下一行中,我检查NULL。所以没问题。

我遇到了崩溃转储,我的应用程序由于dynamic_cast抛出异常而崩溃。

我知道仅当与引用类型一起使用时,dynamic_cast才会抛出。

当我在上面的源代码中使用指针时,dynamic_cast可以抛出异常吗?enter image description here

2 个答案:

答案 0 :(得分:12)

  

任何想法当dynamic_cast与我在上面的源中使用的指针一起使用时会抛出异常吗?

在一个定义良好的程序中,它不能。该标准不允许:

  

[C++11: 5.2.7/9]: 失败的强制转换为指针类型的值是所需结果类型的空指针值。失败的强制转换为引用类型会抛出std::bad_cast(18.7。 2)。

但是,如果传递dynamic_cast无效指针,则调用未定义行为并且可能发生任何,包括某些实现定义的C ++异常,或者运行时崩溃。

答案 1 :(得分:4)

如果传递给它的指针(dynamic_cast<Derived*>)无效,

base可以抛出,因为dynamic_cast需要取消引用它才能知道它的动态类型。

编辑:更具体。与指针一起使用时,dynamic_cast永远不会抛出结构化异常(例如std::bad_cast),但它可能会抛出一个非结构化异常,当传递无效指针时,您无法捕获该异常。使用无效指针会导致未定义的行为,在这种情况下通常意味着访问无效内存和崩溃。

根据您附加到问题的内存转储,很明显pInfo指向无效对象,因此指向所有<Memory access error>条消息。这意味着pInfo是一个无效指针,这就是程序崩溃的原因。你在某个地方有一个bug,你将不得不修复它。