我想知道为什么以下小程序不会导致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;
}
答案 0 :(得分:8)
C ++没有“NullPointerException”。取消引用空指针只是未定义的行为,任何事情都可能发生。
在您的情况下,sayHello()
根本不访问*this
,因此它恰好“正常”工作(在您的编译器,优化设置,运行时和硬件上)。但这并不能保证。未定义的行为是未定义的;该程序也可以在线崩溃或订购披萨。
答案 1 :(得分:2)
我想知道为什么以下小程序不会导致NullPointerException。
因为它是C ++,而不是每个操作都有昂贵的运行时检查的“托管”语言。如果取消引用空指针,则不会出现异常;你会得到某种未定义的行为。
在这种情况下,成员函数不访问对象,因此(在大多数实现中)它的行为就像指针有效一样。如果它确实访问了该对象,那么您可能会遇到运行时故障或内存损坏,从而导致细微的错误和不眠之夜。
尽可能避免指针和new
;必要时使用智能指针和其他RAII技术。如果指针可能为null,则在解除引用之前检查它。