为什么C++调用空指针对象的成员函数可以运行通过?

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class B {
 6 public:
 7     void foo() { cout << "B foo " << endl; }
 8     void pp() { cout << "B pp" << endl; }
 9     void FunctionB() { cout << "funB" << endl; }
10 };
11 
12 int main()
13 {
14     B *somenull = NULL;
15     somenull->foo();
16     somenull->pp();
17     somenull->FunctionB();
18 
19     return 0;
20 }
和c++内存布局有关,为了节约内存和提高调用效率,一般类成员的存储分成两块,一块是单个instance所有,比如非静态成员变量,另一块是所有instances共享的,比如函数代码。这样的布局是对于性能有好处的,代码只要load一次,减少了cache占用和miss。如果你的函数不引用任何instance独有的内存部分,nullptr并无问题,因为不会使用this,只会使用类instance共享的部分,这部分始终存在,即使你没有任何类实例。反之就会出问题,因为你试图访问不存在的数据

posted @ 2017-01-12 22:02  etcjd  阅读(730)  评论(0)    收藏  举报