C++ - new delete 高維數組小結

借鑑:http://www.cnblogs.com/beyondstorm/archive/2008/08/26/1276278.htmlhtml

   http://www.cnblogs.com/platero/archive/2010/12/18/1910057.htmlios

高維數組的動態申請和釋放與二維數組的相似,因此這裏只演示的是二維數組的動態申請和釋放。數組

先來個大衆版的:函數

 1 #include <iostream>
 2 
 3  using namespace std;
 4 
 5 int main(void)
 6 {
 7         int **p;
 8 
 9         p = new int*[3];
10 
11         for (int i = 0; i < 3; i++)
12                 p[i] = new int[4];
13 
14         for (int i = 0; i < 3; i++) {
15                 for (int j = 0; j < 4; j++)
16                         p[i][j] = i+j;
17         }
18 
19         for (int i = 0; i < 3; i++)
20                 delete []p[i];
21 
22         delete []p;
23 
24         return 0;
25 }

  而後是各類new:測試

  

1. 
A (*ga)[n] = new A[m][n]; 
... 
delete []ga; 
缺點:n必須是已知 
優勢:調用直觀,連續儲存,程序簡潔(通過測試,析構函數能正確調用) 

2. A** ga = new A*[m]; 
for(int i = 0; i < m; i++) 
ga[i] = new A[n]; 
... 
for(int i = 0; i < m; i++) 
delete []ga[i]; 
delete []ga; 
缺點:非連續儲存,程序煩瑣,ga爲A**類型 
優勢:調用直觀,n能夠不是已知 

3. A* ga = new A[m*n]; 
... 
delete []ga; 
缺點:調用不夠直觀 
優勢:連續儲存,n能夠不是已知 

4. vector > ga; 
ga.resize(m); //這三行可用可不用 
for(int i = 1; i < n; i++) // 
ga[i].resize(n); // 
... 

缺點:非連續儲存,調試不夠方便,編譯速度降低,程序膨脹(實際速度差異不大) 
優勢:調用直觀,自動析構與釋放內存,能夠調用stl相關函數,動態增加 

5. vector
 ga; 
ga.resize(m*n); 
方法3,4的結合 


6. 2的改進版
A** ga = new A*[m]; 
ga[0] = new A[m*n]; 
for(int i = 1; i < m; i++) 
ga[i] = ga[i-1]+n; 
優勢:連續存儲,n能夠不是已知,析構方便,猜測只需delete [] ga;
spa

 

問題:調試

1.怎麼進行多維數組的聲明和初始化?code

2.是否可以動態分配多維數組,怎麼樣正確析構?orm

3.怎麼理解這些操做?htm

相關文章
相關標籤/搜索