我想知道为什么以下小程序不会引起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;
}
c 没有" nullpointerexception"。删除无效指针只是不确定的行为,任何事情都可能发生。
在您的情况下,sayHello()
根本无法访问*this
,因此它恰好"正常"(在编译器,优化设置,运行时&amp; hw)工作。但这不能保证。不确定的行为简直是未定义的;该程序也可能同样崩溃或在线订购披萨。
我想知道为什么以下小程序不会引起nullpointerexception。
因为它是C ,而不是每次操作的昂贵运行时间检查的"托管"语言。如果您放出无效指针,您将不会有例外;您将获得某种不确定的行为。
在这种情况下,成员函数无法访问对象,因此(在大多数实现中)它的行为就像指针有效一样。如果它确实访问了对象,那么您可能会得到运行时的故障或内存损坏导致细微的错误和不眠之夜。
可以避免使用指针和new
;必须使用智能指针和其他RAII技术。如果指针可能是无效的,请在提出之前对其进行检查。