先看下面一段代码:
1/*******************************************
2 * Author: Leslie Wei
3 * Created Time: 2012年04月22日 星期日 21时35分58秒
4 * File Name: nullObj.cpp
5 * Description:
6 * @Copyright reserved
7 ********************************************/
8
9 #include <stdio.h>
10 class nullObj
11 {
12 public:
13 void Print()
14 {
15 int a = 10;
16 printf("a's value is %d\n", a);
17 }
18 };
19
20 int main(int argc, char *argv[])
21 {
22 nullObj *nobj = NULL;
23 nobj->Print();
24 return 0;
25 }
觉得这段代码有问题吧?22行的nullObj为空,下面怎么能访问了空指针啊?这不是致命的空指针
错误么?
别急,先去test下,你一定很惊讶,访问空指针程序居然能正确运行!
为什么呢?对应到汇编代码中去看吧?编译器是怎么把C++类编译成汇编代码的呢?我们都知道,程序的函数定义最后是装载到
内存的静态内存区的。也就是说不管是C程序还是C++程序,经编译后的函数是没什么区别的,那么编译器怎么实现C++对对象的支持呢?其实编译器只是做了个很看似很简单的操作,就是在编译C++函数的时候将C++的this指针传给了该函数,我们在创建一个对象的时候,会自动把创建的对象赋值给this指针,这里的nullObj *nobj = NULL;说明了this指针为空,但是Print()函数的定义是固化到代码区的,而Print函数中并没有访问this指针,所以即使这里的nobj 为空,函数一样能正确执行!
偶然
发现了这个小问题,特此记录下来。