前言
在《有趣的动态转换》 这篇文章中,运行 测试代码3
会崩溃。本文试图揭示崩溃的原因。
错误更正
在开始之前,需要更正《C++ 虚函数简介》中的一个错误。关于 CBase
和 CDerived
的虚表内容,析构函数的位置并不是直接存储了虚函数的地址,而是存储了一段编译器生成的函数,该函数内部会调用对应的析构函数。
所以正确的虚表应该是下面这样的:
注意:
debug
版默认会引入另外一层间接层,而release
版不会。
错误回顾
回顾一下 测试代码3
运行后的错误提示,如下图: