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

相关文章
相关标签/搜索