前言
在《有趣的动态转换》 这篇文章中,运行 测试代码3 会崩溃。本文试图揭示崩溃的原因。
错误更正
在开始之前,需要更正《C++ 虚函数简介》中的一个错误。关于 CBase 和 CDerived 的虚表内容,析构函数的位置并不是直接存储了虚函数的地址,而是存储了一段编译器生成的函数,该函数内部会调用对应的析构函数。

所以正确的虚表应该是下面这样的:

注意:
debug版默认会引入另外一层间接层,而release版不会。
错误回顾
回顾一下 测试代码3 运行后的错误提示,如下图:

这是一个栈平衡被破坏的错误。在 vs 中单步调试可以知道是在执行 delete(pBaseA

本文详细分析了C++中动态转换导致的delete操作崩溃的原因,指出错误源于非虚析构函数。通过反汇编代码解析,揭示了析构函数为虚函数在多态基类中的必要性,并提醒开发者在基类中声明虚析构函数的重要性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



