当我们引用非静态数据成员时,分段错误实际上是未定义的行为吗?我读了下面的规则,我一直试图写一个例子,它反映了一个例子。规则从3.8/5 N 3797开始:在对象的生存期开始之前,但在分配了对象将占用的存储之后,或者在对象的生存期结束之后,在对象占用的存储被重用或释放之前,任何指向对象将位于或曾经位于的存储位置的指针都可以被使用,但只能以有限的方式使用。关于正在建造或毁坏的物体,见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?
3 回答
慕斯王
TA贡献1864条经验 获得超2个赞
规则3.8/5是关于对象的构造/销毁以外的时间,而是对象所在内存的分配/释放时间。以下说明对象生命周期之外的点:
void *buffer = malloc(sizeof(A));
// outside of lifetime of a
// a->b is undefined
A* a = new (buffer) A();
// within lifetime of a
// a->b is valid
a->~A();
// outside of lifetime of a
// a->b is undefined
free(buffer);
从技术上讲,您的帖子实际上并不反映规则3.8/5,因为您没有在对象生命周期之外访问它。您只是将随机内存作为实例。
- 3 回答
- 0 关注
- 412 浏览
添加回答
举报
0/150
提交
取消