我偶然发现了这段代码,它对我来说似乎完全不完整,但确实发生了 this
为 null
的情况。我只是不明白这怎么可能是 null
它在一个普通的方法调用中,例如
myObject->func();
在 MyObject::func()
中我们有
if (!this) { return false; }
有什么方法可以让第一行抛出 NullPointerException
而不是进入 null
(?) 方法?
最佳答案
如果你有:
MyObject *o = NULL;
o->func();
接下来会发生什么取决于 func
是否是虚拟的。如果是,那么它将崩溃,因为它需要一个对象来从中获取 vtable。但如果它不是虚拟的,则调用将 this 指针设置为 NULL。
我相信标准说这是“未定义的行为”,所以任何事情都可能发生,但典型的编译器只是生成代码而不检查指针是否为 NULL。一些著名的库依赖于我描述的行为:MFC 有一个类似于 SafeGetHandle
的函数,它可以在空指针上调用,并在这种情况下返回 NULL。
您可能想要编写一个可重用的辅助函数:
void CheckNotNull(void *p)
{
if (p == NULL)
throw NullPointerException();
}
然后您可以在函数的开头使用它来检查它的所有参数,包括 this
:
CheckNotNull(this);
关于c++ - 如果(!这){ 返回假; },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663326/