关于深度探索C++对象模型的疑问
这段时间拜读了深度探索C++对象模型,了解了一些C++底层的知识,受益良多在阅读第162页的时候,文章介绍,利用Base2的指针调用派生类的虚拟析构函数的时候,此时的指针是指向派生类中的Base2部分的,我们就要进行一个调整。
我们要将this指针由对象中指向BASE2部分的地址改变为派生类对象的地址,这样我们应该减去offset,而在书中是用offset加上this指针上头。
OK,我们可以理解为offset此处为负值。
但是在163页,讲到了利用THUNK技术来实现这一段汇编代码。
pbase2_dock_thunk:
this += sizeof( base1 );
Derived::~Derived( this );
我在机器上使用VS2008做的测试,其中sizeof( Base1 )是8,跟进Derived中Base2部分的虚表中的析构函数,会看到如下的汇编代码:
sub ecx,0x8 //ecx保存对象中Base2部分的首地址,此处减去sizeof( Base1 ),使得ecx指向Derived的对象的首地址
jmp Derived::~Derived() //跳转到Derived::~Derived()函数中执行
所以在我的理解,这里书中介绍的有错误,应该改写为
在this指向Derived函数中的Base2部分,调用虚析构函数的时候,应该减去offset,即 this -= sizeof( base1 );