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

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