我想知道为什么下面的小程序不会导致NullPointerException。 任何想法? 输出是2x Hello World !!!在我的MacBook上使用clang-500.2.79。空指针可访问
#include <iostream>
using namespace std;
class Strange {
public:
Strange() {}
virtual ~Strange() {}
void sayHello() {
cout<<endl<<"Hello World!!!"<<endl;
}
};
int main(void) {
Strange* s = new Strange();
delete s; s = NULL;
s->sayHello();
(*s).sayHello();
return 0;
}
不完全正确......我期望对NULL解引用有一个分段错误。不过,我认为编译器优化只是忽略了解引用操作,因为该函数不使用'this'参数,所以不会发生实际的解除引用。 – immortal
@immortal:只有当内存被访问时,并且只有当指针指向一个不可访问的内存页面时,并且只有当硬件支持内存保护时。分段故障是一个硬件级别的故障,它只是由实际访问内存的尝试触发的;它对解引用等软件级概念一无所知。 –
我尝试了几个编译器优化,现在也尝试了最新的gcc(从-O0直到O3),输出始终工作,我从来没有得到任何seg故障或其他异常:( – Mats