360笔试题-类指针

问题描述:

地址: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;
}
为何输出func_a,背后的原理是什么?

很好的答案:

成员函数不在类所占的空间里,实际调用成员函数有个隐藏的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;
}
则函数a里边:

     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
360笔试题-类指针





360笔试题-类指针

上一篇:Oracle 维护 online redo log


下一篇:cocos2d-x ——HelloWorld