當(dāng)我們引用非靜態(tài)數(shù)據(jù)成員時,分段錯誤實際上是未定義的行為嗎?我讀了下面的規(guī)則,我一直試圖寫一個例子,它反映了一個例子。規(guī)則從3.8/5 N 3797開始:在對象的生存期開始之前,但在分配了對象將占用的存儲之后,或者在對象的生存期結(jié)束之后,在對象占用的存儲被重用或釋放之前,任何指向?qū)ο髮⑽挥诨蛟?jīng)位于的存儲位置的指針都可以被使用,但只能以有限的方式使用。關(guān)于正在建造或毀壞的物體,見12.7。不然的話,這樣的指針引用已分配的存儲(3.7.4.2),并將指針當(dāng)作指針的類型使用。void*定義得很清楚。允許通過這樣的指針進(jìn)行間接操作,但得到的lvalue只能以有限的方式使用,如下所述。在下列情況下,程序具有未定義的行為:[...]-指針用于訪問非靜態(tài)數(shù)據(jù)成員或調(diào)用對象的非靜態(tài)成員函數(shù),或[...]我寫的例子是:#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產(chǎn)生的分割錯誤,即UB?
3 回答

慕斯王
TA貢獻(xiàn)1864條經(jīng)驗 獲得超2個贊
規(guī)則3.8/5是關(guān)于對象的構(gòu)造/銷毀以外的時間,而是對象所在內(nèi)存的分配/釋放時間。以下說明對象生命周期之外的點(diǎn):
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);
從技術(shù)上講,您的帖子實際上并不反映規(guī)則3.8/5,因為您沒有在對象生命周期之外訪問它。您只是將隨機(jī)內(nèi)存作為實例。
- 3 回答
- 0 關(guān)注
- 441 瀏覽
添加回答
舉報
0/150
提交
取消