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

Raj*_*ian 9 c++ dynamic-cast

我在我的源代码中使用dynamic_cast来将指针转换为如下所示的东西,

Base *base = here storing the pointer;

Derived *derived = dynamic_cast<Derived*>(base);
Run Code Online (Sandbox Code Playgroud)

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

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

我知道dynamic_cast只有在与引用类型一起使用时才会抛出.

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

Lig*_*ica 14

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

在定义明确的计划中,它不能.该标准不允许:

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

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


Gor*_*pik 6

dynamic_cast<Derived*>如果传递给它的指针 ( base) 无效,则可能会抛出异常,因为dynamic_cast需要取消引用它才能知道其动态类型。

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

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