为什么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共享的部分,这部分始终存在,即使你没有任何类实例。反之就会出问题,因为你试图访问不存在的数据

浙公网安备 33010602011771号