当我们引用非静态数据成员时,分段错误实际上是未定义的行为吗?
在对象的生存期开始之前,但在分配了对象将占用的存储之后,或者在对象的生存期结束之后,在对象占用的存储被重用或释放之前,任何指向对象将位于或曾经位于的存储位置的指针都可以被使用,但只能以有限的方式使用。关于正在建造或毁坏的物体,见12.7。 不然的话,这样的指针引用已分配的存储(3.7.4.2),并将指针当作指针的类型使用。 void*
定义得很清楚。允许通过这样的指针进行间接操作,但得到的lvalue只能以有限的方式使用,如下所述。在下列情况下,程序具有未定义的行为: [...]
-指针用于访问非静态数据成员或调用对象的非静态成员函数,或 [...]
#include <iostream>#include <typeinfo>using std::cout;using std::endl;struct A{ int b = 5; static const int a = 5;};int main(){ A *p = (A*)0xa31a3442; cout << p -> a; //1, Well-fromed, there is no compile-time error cout << p -> b; //2, Segmentation fault is producing}
//1
UB
//2
UB
?
慕斯王