访问 nullptr 怎么可能工作

How is possible that accessing nullptr works?

本文关键字:工作 怎么可能 nullptr 访问      更新时间:2023-10-16

我有一个简单的类:

class B
{
public:
    int getData() { return 3; }
};

然后,我用 nullptr 初始化一个指向它的指针:

B *foo{ nullptr };

然后,尝试使用它会带来惊喜:

int t = foo->getData();

而 t 现在是 3。如果不构造类,这怎么可能?是因为getData()不使用"this"吗?这打破了我对指针的所有知识。

这是预期的行为吗?我在Visual Studio 2013工作。

这是预期的行为吗?

不,这是UB,一切皆有可能。

是因为getData()不使用"this"吗?

是的,它可能有效,因为this不会在特殊情况下使用,但不能保证任何事情。

这是未定义的行为,所以你真的应该非常害怕。

它可能会碰巧显然做了一些事情(在您的C++实现上),因为getData函数不是虚拟的,并且不使用B的任何成员。因此,生成的代码不会取消引用空指针。

这是未定义的行为,您正在从nullptr访问成员方法。不会定义任何特定的行为或结果。

在这种情况下;给定(cpp首选项):

关键字 this 是一个 prvalue 表达式,其值是调用成员函数的对象的地址。

由于 thisNULL值没有被取消引用 - 成员方法不是虚拟的,并且不访问this的任何成员数据 - 它"似乎"有效。