2015-08-28 26 views
0

每次調用delete後,q [2]和p [1] [2]的值是多少?並解釋一下?通過new動態分配並在C++中刪除

#include <iostream> 
using namespace std; int main() { 
int **p = new int*[5]; int *q = new int[5]; 
for (int i = 0; i < 5; i++) { 
q[i] = i; 
} p[1] = q; 
delete p; 
delete q; 
delete [] q; 
} 
+1

您是否明白嘗試訪問已刪除的對象會導致未定義的行爲? – Beta

+0

使用錯誤的'delete'也是未定義的行爲。你用'delete'匹配'new []'(至少對於'p';用'q',你做得正確,但只有在使用了錯誤的後)。 – chris

+0

@chris:我知道那是錯的,但我不知道它是UB。 – Beta

回答

0

這將調用未定義行爲很多

  • delete p,而p陣列,從而它應當delete[] p
  • 兩個連續刪除q,其中一個在數組中形成另一個非數組形式。正確的一個是數組形式,刪除其他!

現在,回答這個問題。當的值爲2(歸因於for循環),直到q的刪除,因爲由於懸掛指針q的取消引用而調用未定義的行爲。

p[1][2]值是2p[1] == q)直到p刪除,當它調用未定義的行爲是由於懸掛指針p的derefencing。

順便說一下,SO是不是這個地方要問怎麼做你的任務!