c++ - 如果(!这){ 返回假; }

标签 c++ null this

我偶然发现了这段代码,它对我来说似乎完全不完整,但确实发生了 thisnull 的情况。我只是不明白这怎么可能是 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/

相关文章:

c++ - 调试时 Visual Studio 2013 崩溃?

sql - NULL 值对 SQL Server 存储的影响?

c++ - 前向声明类型上的 std::vector

c++ - 在头文件中设置常量 char*?

c++ - c++ 数据结构建议

php - 使用 mysql 中的 php 更新值 NULL

php - PHP 中的 Null vs. False vs. 0

没有 "this"的 JavaScript 对象构造

c++ - 初始化器中的 this 关键字用于歧义解决

c++ - 是否可以在 C++ 中使用 "this"在成员函数中创建本地对象?