为什么我的程序在指向NULL时不会崩溃?

njp*_*wal 1 c++

我写了一个非常简单的代码.在动态创建一个对象,然后我删除该对象并将其分配给零.之后我访问该对象的成员函数,但我的程序不会崩溃,而是返回值.

class MyClass
{
public:
    MyClass() {}
    int funct() { return 0; }
};

int main()
{
    MyClass *mc = new MyClass;

    delete mc;
    mc = 0;

    // The program should crash here as I've set mc to zero after deleting 
    // it. But it returns the value.
    int retVal = mc->funct();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我对new的理解,删除和赋值为零,这段代码应该崩溃,或者给出异常.

NO_*_*AME 6

您可以将方法可视化为函数:

int funct(MyClass *this) { return 0; }
Run Code Online (Sandbox Code Playgroud)

您可以看到该函数根本不使用this,因此如果它为0则不会崩溃.

但是,不要在实际代码中执行此类操作.这仍然是一个未定义的行为,编译器优化可能会搞砸它.