能力值:
( LV2,RANK:10 )
|
-
-
26 楼
新人刚来,不怎么懂~我这解释的就是C++内存分配里的虚表和虚表指针了,代码分析没看懂,意思看懂了
|
能力值:
( 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的编译结果。
|
能力值:
( LV15,RANK:520 )
|
-
-
28 楼
其中编译器的处理代码模式完全不懂,不好意思
|
能力值:
( LV4,RANK:40 )
|
-
-
29 楼
感觉到你在进步,感觉到你在谦逊,加油吧,你的努力不会白费的
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
 膜拜下,韬哥继续努力,90后的榜样
|
能力值:
( 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
|
能力值:
( LV15,RANK:520 )
|
-
-
32 楼
都不重要了,因为有了钱老师的C++反汇编逆向分析
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
过来学习了。。受教。。。
|
|
|