为什么以下程序不会产生运行时错误!!
#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;
}
答案 0 :(得分:1)
class temp
是微不足道的,并且没有特殊的隐藏信息,例如需要this
来解决func
方法调用和void func(){cout<<"it works"<<endl;}
制作的vtable不使用this
,因此它永远不会实现this
为NULL并访问外部边界。
应该注意的是,即使使用this
,也不会发生崩溃。该程序可能会宣布未定义的行为,并残忍地谋杀一只独角兽。
答案 1 :(得分:1)
未定义的行为。
当标准表明行为未定义时,允许C ++程序做任何想做的事情。一个必须明白未定义的行为包括“假装一切正常”。
这里可能发生的是编译器认识到,在行为定义明确的任何情况下,调用func()
将导致打印“it works”。因为当行为定义不明确时,它允许做任何它想做的事情,它做最简单的事情(在定义的情况下也是最有效的)并且总是导致打印“它工作”而不管是否在有效对象上调用它。