| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 408 人关注过本帖
标题:关于深度探索C++对象模型的疑问
只看楼主 加入收藏
jonny_yue
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-5-7
收藏
 问题点数:0 回复次数:0 
关于深度探索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 );
搜索更多相关主题的帖子: 文章 知识 
2012-08-15 10:28
快速回复:关于深度探索C++对象模型的疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027012 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved