使用 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
,否则返回空指针。
【讨论】:
谢谢,这很有道理。能否请您指出“格式良好的演员表”的定义,以便我能够验证A
和 B
的这种关系?
@SagiLow 在这种情况下,格式良好意味着如果您对底层指针类型进行动态转换,您将获得良好的转换(不是像源一样的空指针不是空指针) .所以,如果你有std::dynamic_pointer_cast<std::shared_ptr<A>>(object_of_shared_ptr_B)
,那么你需要dynamic_cast<A*>(object_of_pointer_to_B)
才有效。以上是关于使用 dynamic_pointer_cast 时出现异常 0xC0000409(堆栈缓冲区溢出)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
[c++]dynamic_pointer_cast用于shared_ptr之间类型的转换,基类需要有虚函数
使用 php artisan migrate 时,迁移时更改表名,使用 tinker 保存对象时出错