解引用nullptr程序未必崩溃?为何这段C++代码能正常运行?
为什么空指针调用非虚成员函数不会崩溃?
- 非虚成员函数的调用地址在编译阶段就已确定,编译器会把
f->test()转换为类似foo::test(f)的调用形式,这里的f会作为this指针传入函数。但你的test()函数没有访问任何成员变量,完全没用到this指针的指向内容,自然不会触发崩溃。 - 只有当成员函数需要访问对象的成员变量(也就是要解引用
this指针)时,空指针才会导致程序崩溃。比如如果test()里写了this->some_var,程序运行时就会出错。 - 如果
test()是虚函数,情况就完全不同:虚函数需要通过对象的虚函数表指针(vptr)查找函数地址,空指针没有对应的虚函数表,这时调用会立刻崩溃。
你的代码片段:
#include <iostream> #include <vector> struct foo { void test() { std::cout << "This is displayed\n"; } }; int main() { foo *f = nullptr; f->test(); }
这段代码里的test()是普通成员函数,既非虚函数也不访问成员变量,所以调用时只是传了个nullptr作为this指针,但函数内部没用到它,因此在你的环境下能正常运行。
要注意的是,这种行为属于C++标准中的未定义行为,标准没有保证它一定能正常执行,换个编译器或平台可能就会崩溃,不要依赖这种写法。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

