为了账号安全,请及时绑定邮箱和手机立即绑定

当我们引用非静态数据成员时,分段错误实际上是未定义的行为吗?

当我们引用非静态数据成员时,分段错误实际上是未定义的行为吗?

C++ C
Cats萌萌 2019-05-30 11:15:27
当我们引用非静态数据成员时,分段错误实际上是未定义的行为吗?我读了下面的规则,我一直试图写一个例子,它反映了一个例子。规则从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,因为您没有在对象生命周期之外访问它。您只是将随机内存作为实例。


查看完整回答
反对 回复 2019-05-30
  • 3 回答
  • 0 关注
  • 412 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信