C++ - new delete 高维数组小结

借鉴:http://www.cnblogs.com/beyondstorm/archive/2008/08/26/1276278.html

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

高维数组的动态申请和释放与二维数组的类似,所以这里只演示的是二维数组的动态申请和释放。

先来个大众版的:

 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;

 

问题:

1.怎么进行多维数组的声明和初始化?

2.是否能够动态分配多维数组,怎么样正确析构?

3.怎么理解这些操作?

 

posted @ 2014-12-25 11:26  银槲  阅读(...)  评论(...编辑  收藏