为什么这个c ++程序不会产生运行时错误

时间:2015-10-21 00:50:30

标签: 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正在访问应该崩溃的NULL内存。

如果解释是该类没有成员变量,那么我尝试了下面的代码,它也有效吗?

#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;
}

2 个答案:

答案 0 :(得分:1)

class temp是微不足道的,并且没有特殊的隐藏信息,例如需要this来解决func方法调用和void func(){cout<<"it works"<<endl;}制作的vtable不使用this,因此它永远不会实现this为NULL并访问外部边界。

应该注意的是,即使使用this,也不会发生崩溃。该程序可能会宣布未定义的行为,并残忍地谋杀一只独角兽。

答案 1 :(得分:1)

未定义的行为。

当标准表明行为未定义时,允许C ++程序做任何想做的事情。一个必须明白未定义的行为包括“假装一切正常”。

这里可能发生的是编译器认识到,在行为定义明确的任何情况下,调用func()将导致打印“it works”。因为当行为定义不明确时,它允许做任何它想做的事情,它做最简单的事情(在定义的情况下也是最有效的)并且总是导致打印“它工作”而不管是否在有效对象上调用它。