问题描述:
地址:http://bbs.csdn.net/topics/390701174?page=1#post-396681441
360笔试题 类指针
#include <iostream>using namespace std;class A{public: void a(){ cout << "func_a" << endl; }};int main(){ A * p = NULL; p -> a(); return 0;}很好的答案:
成员函数不在类所占的空间里,实际调用成员函数有个隐藏的this指针,只要函数a()没有访问类的成员变量(这里也没定义成员变量),就不会有问题...
A * p = NULL; // 指明p是类型A的指针
p -> a(); // 调用函数a,类似于这样调用a(p);p是NULL,但没有访问p的成员变量就不会有问题
我的答案:
12: A * p = NULL;
004114CE mov dword ptr [p],0
13: p -> a();
004114D5 mov ecx,dword ptr [p]
004114D8 call A::a (41114Fh) //这里的调用并没有调用实例p,而是调用的类A,所以与p是否指向野指针无关的
14: return 0;
代码修改为:
#include <iostream>using namespace std;class A{int
b;public: void a(){b
= 0; cout << "func_a" << endl; }};int main(){ A * p = NULL; p -> a(); return 0;} 7: void a(){
00411510 push ebp
00411511 mov ebp,esp
00411513 sub esp,0CCh
00411519 push ebx
0041151A push esi
0041151B push edi
0041151C push ecx
0041151D lea edi,[ebp-0CCh]
00411523 mov ecx,33h
00411528 mov eax,0CCCCCCCCh
0041152D rep stos dword ptr es:[edi]
0041152F pop ecx
00411530 mov dword ptr [ebp-8],ecx
8: b=0;
00411533 mov eax,dword ptr [this] //此时调用的有this,也就是实例自己,然而实例指向的野指针,这样调用就会崩溃了。
00411536 mov dword ptr [eax],0
9: cout << "func_a" << endl;
0041153C mov esi,esp
0041
原文:http://blog.csdn.net/lileiyang12/article/details/18814601