1

請看看這段代碼刪除指針自動變量

int i = 10;          //line 1 
int *p = &i;         //line 2 
delete p;          //line 3 
cout << "*p = " << *p << ", i = " << i << endl; //line 4 
i = 20;           //line 5 
cout << "*p = " << *p << ", i = " << i << endl; //line 6 
*p = 30;          //line 7 
cout << "*p = " << *p << ", i = " << i << endl; //line 8 

這是什麼代碼的結果?尤其是第3,5和7行?他們是否調用未定義的行爲?輸出是什麼?

編輯:我試着運行它使用g ++,它的編譯和運行良好!我在Windows 7上使用MinGW。

標準在這種情況下說什麼?

+0

你有沒有試過運行它?可能你可以添加你的跑步結果,然後我們可以討論它? – Nim 2010-12-03 08:59:54

+0

爲什麼不編譯看看?我得到一個段錯誤... – Kricket 2010-12-03 09:01:50

+0

對象0x7fff5fbff5ec的***錯誤:被釋放的指針未被分配 ***在malloc_error_break中設置一個斷點,以便在運行它時進行調試...在MacOS X中用g ++ 4.1編譯。我對「跑步」的定義是跑得不好。 – 2010-12-03 09:06:59

回答

5

如果您曾經使用new動態分配過指針,則只能刪除一個指針。在這種情況下,您尚未使用new分配指針,只是簡單地定義並初始化它,指向int類型的局部變量。

對未使用new動態分配的指針調用delete是所謂的Undefined Behavior。簡而言之,這意味着當執行這樣的代碼時,地球上的任何事情都可能發生,並且你不能向這個星球上的任何人投訴。

1

delete p;是UB,所以任何進一步的行爲都無法預測或依賴。你的計劃可能會立即崩潰或花你所有的錢,或從main()退出並假裝什麼都沒有發生。

0

第3行肯定是未定義的行爲,因爲您試圖刪除不在堆上的地址的內存。