我写了一个非常简单的代码。在动态创建一个对象,然后我删除该对象并将其分配给零。之后我访问该对象的成员函数,但我的程序没有崩溃,而是返回值。
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;
}
根据我对新的理解,删除并将分配归零,此代码应该崩溃或提供异常。
答案 0 :(得分:6)
您可以将方法可视化为函数:
int funct(MyClass *this) { return 0; }
您可以看到该功能根本不使用this
,因此如果它为0则不会崩溃。
但是,不要在实际代码中执行此类操作。这仍然是未定义的行为,编译器优化可能会搞砸它。