【问题标题】:When dynamic_cast will throw exception in case used with pointer?与指针一起使用的情况下,dynamic_cast 何时会抛出异常?
【发布时间】:2013-05-10 06:42:49
【问题描述】:

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

Base *base = here storing the pointer;

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

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

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

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

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

【问题讨论】:

标签: c++ dynamic-cast


【解决方案1】:

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

在一个定义明确的程序中,它不能。标准不允许:

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

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

【讨论】:

    【解决方案2】:

    dynamic_cast&lt;Derived*&gt; 可以在传递给它的指针 (base) 无效时抛出,因为 dynamic_cast 需要取消引用它才能知道它的动态类型。

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

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

    【讨论】:

    • 根据我的分析,我了解到,在指针无效的情况下,它给出了 NULL。当它可以抛出异常而不是返回 NULL。您能否就此处的无效指针的含义提供您的意见。
    • @RajeshSubramanian 无效指针是指既不指向对象也不为空的指针。如果base指向一个被破坏的对象或者没有被初始化为一个对象的地址,那么它是无效的。
    • 在我的崩溃转储中,我发现该对象不为空;因为在这个演员之前,我有一个检查 null 的条件。
    • 如果它为空,你就没有问题:空的dynamic_cast 总是产生空。但是指针指向一个有效的对象吗?有效对象是已构建但尚未销毁的对象。
    • 对象不为空。但是它包含的成员值很少是不可访问的。这会使 dynamic_cast 失败吗?我现在在我的实际问题中附加了来自windbg的这个对象的监视窗口。 (pInfo) 是传递给 dynamic_cast 的对象。
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2015-05-01
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多