首页
社区
课程
招聘
[原创]C++代码分析
发表于: 2011-8-25 14:29 20154

[原创]C++代码分析

2011-8-25 14:29
20154
收藏
免费 6
支持
分享
最新回复 (32)
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
新人刚来,不怎么懂~我这解释的就是C++内存分配里的虚表和虚表指针了,代码分析没看懂,意思看懂了
2011-8-31 17:00
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
这里把Test的地址的指针放入ESI里面,然后根据ESP+8来判断是否调用delete操作符,这些都是编译器自动添加的,这是编译器的事,我还没那技术去研究
00401014   .  83C4 04       ADD ESP,4
00401017   .  F64424 08 01  TEST BYTE PTR SS:[ESP+8],1
0040101C   .  74 09         JE SHORT 00401027
0040101E   .  56            PUSH ESI
0040101F   .  E8 D6000000   CALL <JMP.&MSVCR90.operator delete>
00401024   .  83C4 04       ADD ESP,4
00401027   >  8BC6          MOV EAX,ESI
00401029   .  5E            POP ESI
0040102A   .  C2 0400       RETN 4

经编译器处理后,析构函数是会增加一个参数的。在main函数最后调用析构函数的时候:

004010E0  |.  6A 01         PUSH 1
004010E2  |.  8BCE          MOV ECX,ESI
004010E4  |.  FFD2          CALL EDX

编译器传入1,通知将分配的对象删除掉,这是代码中 delete pTest的编译结果。
2011-9-1 10:10
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
28
其中编译器的处理代码模式完全不懂,不好意思
2011-9-1 18:48
0
雪    币: 114
活跃值: (664)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
29
感觉到你在进步,感觉到你在谦逊,加油吧,你的努力不会白费的
2011-9-1 23:27
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
膜拜下,韬哥继续努力,90后的榜样
2011-9-3 09:27
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
31
lz, 你在main函数里面应该将new出来的TestA 附给基类指针Test* pTest, 这样才能体现出多态性---当基类指针指向不同实现的基类对象时,表现出不同的行为

对于多态的实现, 关键就是虚函数表的应用,
至于为什么抽象类不能实例化, 是因为它有完整的需函数表,但是需函数表是未完全初始化的(纯虚函数无实现),

所以必须要可实例化派生类的表去覆盖基类的表才行

你在察看反汇编代码时会注意到一个现象:
非需函数调用时是依赖相对地址, call xxxxxxxx   -- 对应指令 e8??????????
对于虚寒树则是直接取函数地址, call [expression]         -- 对应指令 ff???????

写过一个c/C++ 关系的小铁子,欢迎访问

http://bbs.pediy.com/showthread.php?t=135246
2011-10-9 14:52
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
32
都不重要了,因为有了钱老师的C++反汇编逆向分析
2011-10-10 04:43
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
过来学习了。。受教。。。
2011-10-13 16:57
0
游客
登录 | 注册 方可回帖
返回