11

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

Base *base = here storing the pointer;

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

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

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

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

当我在上面的源代码中使用指针时,当 dynamic_cast 与指针一起使用时,知道什么时候会抛出异常吗?在此处输入图像描述

4

2 回答 2

18

当我在上面的源代码中使用指针时,当 dynamic_cast 与指针一起使用时,知道什么时候会抛出异常吗?

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

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

但是,如果您传递dynamic_cast了一个无效的指针,那么您将调用未定义的行为并且任何事情都可能发生,包括一些实现定义的 C++ 异常或运行时崩溃。

于 2013-05-10T08:30:24.723 回答
4

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

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

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

于 2013-05-10T06:54:07.893 回答