借鑑: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