You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解引用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:02