空指针可访问

时间:2014-03-07 11:28:22

标签: c++ pointers exception null delete-operator

我想知道为什么以下小程序不会导致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;
}

2 个答案:

答案 0 :(得分:8)

C ++没有“NullPointerException”。取消引用空指针只是未定义的行为,任何事情都可能发生。

在您的情况下,sayHello()根本不访问*this,因此它恰好“正常”工作(在您的编译器,优化设置,运行时和硬件上)。但这并不能保证。未定义的行为是未定义的;该程序也可以在线崩溃或订购披萨。

答案 1 :(得分:2)

  

我想知道为什么以下小程序不会导致NullPointerException。

因为它是C ++,而不是每个操作都有昂贵的运行时检查的“托管”语言。如果取消引用空指针,则不会出现异常;你会得到某种未定义的行为。

在这种情况下,成员函数不访问对象,因此(在大多数实现中)它的行为就像指针有效一样。如果它确实访问了该对象,那么您可能会遇到运行时故障或内存损坏,从而导致细微的错误和不眠之夜。

尽可能避免指针和new;必要时使用智能指针和其他RAII技术。如果指针可能为null,则在解除引用之前检查它。