假设有以下代码:
Foo & foo = getFoo();
foo.attr; // 100% safe access?
If foo
是一个指针,我会检查它是否是NULL
,但是因为它是一个参考,所以这样的检查是不必要的。我想知道的是是否有可能弄乱对象的引用,从而导致访问其属性不安全。
我尝试了一些例子,比如尝试投射NULL
to a Foo
对象,但我遇到编译错误。我只是想确保上面的代码始终是安全的,并且不存在可能的内部C++
我应该知道的黑魔法。
从本杰明的回答中,我可以制作一个示例代码,我确实得到了分段故障 http://en.wikipedia.org/wiki/Segmentation_fault来自参考文献,因此它回答了我的问题。我将粘贴我的代码,以防万一有人对未来感兴趣:
#include <iostream>
using namespace std;
class B
{
public:
int x;
B() {x = 5;}
};
class A
{
public:
void f()
{
b = *(B*)NULL;
}
B & getB()
{
return b;
}
B b;
};
int main()
{
A a;
a.f();
cout << a.getB().x << endl;
return 0;
}
是的,这是可能的。
Foo& Fr = *(Foo*)nullptr;
从技术上讲,这已经是取消引用该指针的未定义行为。但它很可能不会导致任何可观察到的错误。但这可能会:
Fr.attr = 10;
然而,正如 Jonathan Wakely 在评论中指出的那样,您没有理由检查这样的案例。如果函数返回无效引用,则该函数已损坏,需要修复。假设引用有效,您的使用代码不会被破坏。然而,有效的参考可以become正如 David Schwartz 的回答中提到的,在完全合法的代码中无效(尽管不为空)。但你没有办法检查这一点。您只需要知道在什么情况下会发生这种情况,然后停止使用该参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)