访问nullptr的可能性如何?

时间:2016-03-01 08:28:43

标签: c++ c++11 visual-studio-2013 nullptr

我有一个简单的课程:

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

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

B *foo{ nullptr };

然后,尝试使用它会让人感到惊讶:

int t = foo->getData();

和t现在是3.如果没有构建类,这怎么可能?是因为getData()不使用"这个"?这打破了我对指针的所有了解。

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

3 个答案:

答案 0 :(得分:3)

这是undefined behavior,所以你真的应该非常scared

显然可能会做某事(在你的C ++实现上),因为this函数不是虚拟的,不使用getData的任何成员。因此生成的代码不会取消引用空指针。

答案 1 :(得分:2)

  

这是预期的行为吗?

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

  

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

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

答案 2 :(得分:1)

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

在这种情况下;给定(cppreference):

  

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

由于NULL的{​​{1}}值未被取消引用 - 成员方法不是虚拟的,并且不访问this的任何成员数据 - 它似乎“似乎”起作用。