今天在群里看了一个奇怪的代码。这样的代码是可以直接运行的
查看了编译以后的代码如下:
可以看到编译器编译以后的汇编代码,这里并没有使用任何pc指针所指向的内存中的数值。而是将pc作为this指针压入栈然后直接调用了c::run的地址。
接着就索性研究一下虚函数,成员函数和静态成员函数。
把类修改成如下。
执行代码如下:
可以看到成员函数以及静态函数都正常执行了,当通过pc指针引用虚函数的时候报告内存访问错误。
反编译查看一下代码如下:
可以看到成员函数和静态函数的入口地址都是在编译代码时确定的。而虚函数需要通过pc指针访问虚表来确定。这就需要访问pc所指向内存地址的数据。可是这里并没有创建对象。因此就报错了。
修改代码使用Placement new来初始化则可以正常访问虚函数。