background image

型,所以此时 template 后面的内容为空。那么怎么判断这两个类都是可以正常使用的呢?大家可以看看下面的

 

范例:

[cpp] 

view plaincopyprint?

1.

249:      data<

int

> p;  

2.

004013BD   lea         ecx,[ebp-10h]  

3.

004013C0   call        @ILT+45(data<

int

>::data<

int

>) (00401032)  

4.

004013C5   mov         dword ptr [ebp-4],0  

5.

250:      data<

int

*> q;  

6.

004013CC   lea         ecx,[ebp-14h]  

7.

004013CF   call        @ILT+35(data<

int

 *>::data<

int

 *>) (00401028)  

8.

251:  }  

    我们发现,第一个函数的 call 地址是 0x00401032,第二个地址为 0x00401028。但是这说明不了什么,因为

第二个地址完全也可能是第一个模板类引申的。我们应该跟到每一个函数里面(其实这里的地址在 VC 下都是

 

跳转地址)。

    第一个变量的实际进入函数如下所示:

[cpp] 

view plaincopyprint?

1.

234:      data() {printf("normal!\n");}  

2.

00401340   push        ebp  

3.

00401341   mov         ebp,esp  

4.

00401343   sub         esp,44h  

5.

00401346   push        ebx  

6.

00401347   push        esi  

7.

00401348   push        edi  

8.

00401349   push        ecx  

9.

0040134A   lea         edi,[ebp-44h]  

10.

0040134D   mov         ecx,11h  

11.

00401352   mov         eax,0CCCCCCCCh  

12.

00401357   rep stos    dword ptr [edi]  

13.

00401359   pop         ecx  

14.

0040135A   mov         dword ptr [ebp-4],ecx  

15.

0040135D   push        offset string "normal!\n" (0042607c)  

16.

00401362   call        printf (00401540)  

17.

00401367   add         esp,4  

18.

0040136A   mov         eax,dword ptr [ebp-4]  

19.

0040136D   pop         edi  

20.

0040136E   pop         esi  

21.

0040136F   pop         ebx  

22.

00401370   add         esp,44h  

23.

00401373   cmp         ebp,esp  

24.

00401375   call        __chkesp (004023b0)  

25.

0040137A   mov         esp,ebp