为什么C++程序没有产生运行时错误

为什么C++程序没有产生运行时错误,c++,class,C++,Class,为什么下面的程序没有产生运行时错误 #include <iostream> using namespace std; class temp { public: void func(){cout<<"it works"<<endl;} }; int main() { temp* ptr = NULL; ptr->func(); return 0; } 这段代码打印出来了,为什么??ptr正在访问空内存,它应该

为什么下面的程序没有产生运行时错误

#include <iostream>
using namespace std;

class temp
{
    public:
       void func(){cout<<"it works"<<endl;}
};

 int main()
{
   temp* ptr = NULL;
   ptr->func();
   return 0;
}
这段代码打印出来了,为什么??ptr正在访问空内存,它应该崩溃

如果解释是类没有成员变量,那么我尝试了下面的代码,为什么它也能工作

#include <iostream>
using namespace std;

class temp
{
   int i;
    public:
       void func(){cout<<"it works"<<endl;}
};

 int main()
{
   temp* ptr = NULL;
   ptr->func();
   return 0;
}
类temp很简单,没有像vtable这样的特殊隐藏信息,vtable需要它来处理func的方法调用和void func{cout未定义的行为

<> P>一个C++程序被允许做任何它想要的东西,当标准说这个行为是未定义的。并且必须理解,未定义的行为包括假装一切都正常工作。
这里可能发生的情况是,编译器认识到,在行为定义良好的任何情况下,调用func都会导致打印它的工作。因为当行为定义不正确时,它可以做任何它想做的事情,所以它做最简单的事,在定义的情况下也是最有效的,并且总是导致打印无论是否在有效对象上调用它,它都可以工作。

尝试在成员函数中打印i。无法通过ptr访问任何内容。尝试在第二个示例funcvoid func中使用i{coutIt不是一个虚拟函数,而且你从来都不会去引用它。如果这是一个未定义的行为,我也不会感到惊讶,尽管ie,不要依赖它。