第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當(dāng)我們引用非靜態(tài)數(shù)據(jù)成員時,分段錯誤實際上是未定義的行為嗎?

當(dāng)我們引用非靜態(tài)數(shù)據(jù)成員時,分段錯誤實際上是未定義的行為嗎?

C++ C
Cats萌萌 2019-05-30 11:15:27
當(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)存作為實例。


查看完整回答
反對 回復(fù) 2019-05-30
  • 3 回答
  • 0 關(guān)注
  • 441 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號