2016-03-01 65 views
0

我有一个简单的类:访问nullptr的可能性如何?

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

然后,我初始化它的指针与nullptr:

B *foo{ nullptr }; 

,然后尝试使用它自带的惊喜:

int t = foo->getData(); 

现在t是3.如果没有构建这个类,那可能怎么样?是否因为getData()不使用“this”?这打破了我所有关于指针的知识。

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

+1

它的工作原理是因为'foo-> getData()'等同于'getData(foo);'而被调用者从不* dereferences *参数。请注意,即使它起作用,它在C++中也被归类为* undefined behavior *。 – Nawaz

+0

感谢所有的答案。在我看来,它不应该是未定义的行为,它应该崩溃。从我的角度来看,这是安全问题。如果一个方法接收到一个指向类的指针并且这个指针是nullptr,我可以使用这个指针来调用一个方法。是的,我知道它不能保证它会起作用,但是在你的图书馆里是一个漏洞。 – LeDYoM

+0

LeDYoM:“*在我看来,它不应该是未定义的行为,它应该崩溃。”*请耐心使用该语言,阅读C++的设计目标及其历史。 – Nawaz

回答

2

这是预期的行为吗?

不,它是UB,任何事情都是可能的。

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

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

+2

预期的行为与未定义的行为并不相互排斥。这正是我期望的行为。 –

1

这是未定义的行为,您正在访问nullptr的成员方法。没有特定的行为或结果会被定义。

尽管如此,给定的(cppreference):

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

由于thisNULL值没有被解除引用 - 该部件的方法没有虚拟和不访问的任何this成员数据 - 它“似乎”工作。

3

它是undefined behavior,所以你真的应该很scared

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