使用 dynamic_pointer_cast 时出现异常 0xC0000409(堆栈缓冲区溢出)[关闭]

Posted

技术标签:

【中文标题】使用 dynamic_pointer_cast 时出现异常 0xC0000409(堆栈缓冲区溢出)[关闭]【英文标题】:Exception 0xC0000409 (stack buffer overflow) when using dynamic_pointer_cast [closed] 【发布时间】:2020-02-21 15:01:57 【问题描述】:

我在尝试将dynamic_pointer_cast 类型为A 的共享点输入B 时遇到崩溃。B 类型与 A 类型无关,我希望 shared_ptr 为空,但会引发上述异常。 有没有使用dynamic_pointer_cast不安全的场景?

此处出现异常:

使用 MSVC 14.16.27023

【问题讨论】:

minimal reproducible example 会很有帮助。我无法重现该问题。您使用的dynamic_pointer_cast 转换是否遵守dynamic_cast 限制? 【参考方案1】:

std::dynamic_pointer_cast 要求U*(源)到T*(目标)的转换格式正确。如果不是,那么您有未定义的行为。如果您想像从dynamic_cast 那样获取空指针,那么您将不得不编写自己的版本来执行此操作。

另一个选项是测试结果

dynamic_cast<decltype(destination_ptr.get())>(source_ptr.get())

如果成功则调用std::dynamic_pointer_cast,否则返回空指针。

【讨论】:

谢谢,这很有道理。能否请您指出“格式良好的演员表”的定义,以便我能够验证 AB 的这种关系? @SagiLow 在这种情况下,格式良好意味着如果您对底层指针类型进行动态转换,您将获得良好的转换(不是像源一样的空指针不是空指针) .所以,如果你有std::dynamic_pointer_cast&lt;std::shared_ptr&lt;A&gt;&gt;(object_of_shared_ptr_B),那么你需要dynamic_cast&lt;A*&gt;(object_of_pointer_to_B) 才有效。

以上是关于使用 dynamic_pointer_cast 时出现异常 0xC0000409(堆栈缓冲区溢出)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

[c++]dynamic_pointer_cast用于shared_ptr之间类型的转换,基类需要有虚函数

移动智能指针两次与复制

参数标志,不使用时为空,不使用时为默认值

使用 php artisan migrate 时,迁移时更改表名,使用 tinker 保存对象时出错

使用前台服务时允许“使用应用程序时”而不是“始终允许”是不是可以?

为啥在使用自适应查询执行时要使用广播时火花洗牌