我在我的源代码中使用dynamic_cast来将指针转换为下面的内容,
Base *base = here storing the pointer;
Derived *derived = dynamic_cast<Derived*>(base);
如果base没有类层次结构的指针,则强制转换失败并返回NULL。在下一行中,我检查NULL。所以没问题。
我遇到了崩溃转储,我的应用程序由于dynamic_cast抛出异常而崩溃。
我知道仅当与引用类型一起使用时,dynamic_cast才会抛出。
当我在上面的源代码中使用指针时,dynamic_cast可以抛出异常吗?
答案 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,你将不得不修复它。