if(!this){return false; }

时间:2009-03-19 17:59:58

标签: c++ null this

我偶然发现了这段似乎完全被我破坏的代码,但确实发生this null。我只是不知道这可能是null

它在正常的方法调用中,例如

myObject->func();

MyObject::func()内我们有

if (!this) { return false; }

有没有什么方法可以让第一行抛出NullPointerException而不是进入null(?)方法?

7 个答案:

答案 0 :(得分:22)

如果你有:

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);

答案 1 :(得分:2)

一种捕获这类错误(通过设计)的方法是使用指针包装类(类似于shared_ptr),该类在使用空指针参数创建时抛出。它也可能在被解除引用时抛出,但是这有点晚了 - 我猜想比没有好。

答案 2 :(得分:1)

if(this == null)
   throw new NullPointerException;
if(!this)
   return false;

答案 3 :(得分:1)

this可能为空。我怀疑这段代码试图(严重地)检测到竞争条件,其中对象尚未完成初始化或已被删除。

答案 4 :(得分:1)

(this == NULL)是根据标准的未定义行为。我想你应该删除这个检查:)

假设我们进行以下调用:

((CSomeClass*) 0)->method();

行为已经是未定义的,为什么还要在CSomeClass :: method中检查这个== NULL?

<强>编辑: 我假设你的编译器将处理(0 == this)如果你不使用成员变量,但它会在哪里找到虚拟表指针?在这种情况下,您的类不能使用polymoprhism。

答案 5 :(得分:0)

在以下情况下,此指针可能变为null:

class Test
{

public:
    bool f();

private:
    int m_i;
};


bool Test::f()
{
    if(!this)
    {
        return false;
    }

    m_i = 0;
    return true;

}


int main(int argc, char **argv)
{
    Test* p = new Test;
    delete p;
    p = NULL;

    p->f();
}

我想有人会快速破解以避免访问冲突异常。

答案 6 :(得分:-1)

这个== null只应该在你正在调用已删除对象的方法时发生,或者如果某些内容正在写入不应该写入的内存(并特别覆盖对象的this指针)。

您应该调查代码的真正错误,而不是试图像这样解决它。