gpt4 book ai didi

C++:即使被转换的对象不是 NULL,dynamic_cast 也会导致 SEGFAULT。怎么会这样?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:42 25 4
gpt4 key购买 nike

假设我有一个类 A 和一个派生自 A 的类 B。现在,我想使用 dynamic_cast(见下文)将 const A*(称为“a”)转换为 B*。如果“a”真的是 B*,那么我得到的对象指针应该没问题。如果“a”不是 B*,那么我将得到 NULL。

const A* a = new B();
const B* b = dynamic_cast<const B*>(a);

出于某种原因,dynamic_cast 操作会导致 SEGFAULT。如果“a”不是 NULL,那怎么会发生呢?我想如果有任何转换问题,dynamic_cast 会给我一个 NULL 指针,而不是 SEGFAULT。如果我试图访问“b”并且动态转换不成功,我应该只得到一个 SEGFAULT,对吗?我什至还没有尝试访问“b”。

那么,这怎么会发生呢?在上面的代码中,是否有任何我不知道的可能导致 dynamic_cast 变为 SEGFAULT 的情况?

提前致谢:-)

编辑:通过 GDB 运行我的实际程序会得到以下输出:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) where
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff6c0e612 in __cxxabiv1::__dynamic_cast (src_ptr=<optimized out>,
src_type=0x4fa6b0, dst_type=0x516bb0, src2dst=0)
at /var/tmp/portage/sys-devel/gcc-4.6.3/work/gcc-4.6.3/libstdc++-v3/libsupc++/dyncast.cc:61

输出中的下一行仅指向我执行动态转换的代码行。

最佳答案

使用 dynamic_cast 时可能导致崩溃的原因

  • 指针指向空闲内存块。
  • 指针指向非多态类型。
  • 指针指向一个具有多态类型但存在于在禁用 RTTI 的情况下编译的外部库中的对象。
  • 指针指向可能导致保护异常的内存访问(例如保护页或不可访问页)。

验证这些情况之一是否适用于您。

关于C++:即使被转换的对象不是 NULL,dynamic_cast 也会导致 SEGFAULT。怎么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com