型,所以此时 template 后面的内容为空。那么怎么判断这两个类都是可以正常使用的呢?大家可以看看下面的
范例:
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 下都是
跳转地址)。
第一个变量的实际进入函数如下所示:
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