2014-05-04 229 views
-3

這兩種釋放二維數組的方法相似嗎?刪除二維數組C++

int** M = new int*[5]; 

for (int i = 0; i < 5; ++i) 
    M[i] = new int[3]; 

for (int i = 0; i < 5; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     M[i][j] = i + j; 
    } 
} 

刪除我:

for (int i = 0; i < 5; ++i) 
    delete [] M[i]; 
delete [] M; 

和刪除II:

delete [] *M; 
delete [] M; 

是這兩個代碼相同呢?

+0

發生了什麼事?你爲什麼不做廣告? – Ben

+1

爲什麼不使用'的std :: vectors'?節省了很多麻煩 –

+0

的@EdHeal最好的辦法是使用智能指針。但我感興趣的指針和數組的工作現在 – Zeis45

回答

6

delete [] *M;delete [] M[0]相同,因此它不等同於刪除循環中的所有M[i],因爲只有第一個將被刪除。循環是避免內存泄漏的正確方法。

或更好的是,使用std::vector而不是手動分配,你不需要擔心刪除指針。

5

它們不相似。他們不相似的明顯原因是您要撥打new[] 6次,而在delete[]的第二個版本中,您要撥打「刪除」2次。

delete [] *M; 
delete [] M; 

每次調用new[],你應該與delete[]匹配它,顯然你不這樣做。

如果您希望這兩個調用delete[]匹配,您必須更改分配2d數組的方式。的變化會是這樣:

int** M = new int*[5]; 
int *pool = new int[5*3]; 

for (int i = 0; i < 5; ++i, pool += 3) 
    M[i] = pool; 

在上面的例子中,只有2調用new[]製成,曾經爲行指針,以及第二個用於存儲池。然後循環只是在適當的地方將池中的每一行指針指向池中。

現在,「2調用」delete[]將正常工作,只要您在分配和釋放數組之間不會做任何奇怪的事情,例如損壞的內存。

以這種方式分配2d數組的優點是new[]只被調用兩次,而不管列的數量是多少。因此,如果您有10,000 x 10,000矩陣,您的原始版本需要撥打new[] 10,001次,而使用該池的版本只需要撥打new[]即可撥打2個電話。這很可能會加快程序的速度,因爲分配器只被調用兩次(然後再分配兩次)。

另外,如果數組數據需要是連續的,那麼上述方法是優選的,所以可以使用簡單的指針運算來轉到任何行或列。

但是,請確保:

  • 您的數組不改變尺寸和
  • 它不是衣衫襤褸(所有行必須具有相同的列數)。

否則,維護按我描述的方式分配的矩陣變得更加困難。