动态分配数组

来源:互联网 发布:手机影音转换软件 编辑:程序博客网 时间:2024/05/20 19:45

 一维的数组就没什么好说的了。前两天做一个矩阵的东西,要动态分配二维的数组。开始还想着这东西简单啊,直接来:

    int *a=new int[m][n];

结果,crash

仔细一看,发现a是int*而new是int**,于是改为如下:

int n,**a;

    cin>>n;

    for(int i=0;i<n;i++)*(a+i)=new(int[n]);

结果,crash again...

然后无奈的使出杀手锏——上网查资料吧,以下是搜索所得的动态二维分配方法:

(转自http://wlxblog.westgis.ac.cn/130/

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的改进版(Penrose提供,在此感谢)

   A** ga = new A*[m];    ga[0] = new A[m*n];    for(int i = 1; i < m; i++)        ga[i] = ga[i-1]+n;    ...    delete [] ga[0];    delete [] ga;

缺点:程序烦琐,ga为A**类型
优点:连续储存,调用直观,n可以不是已知

其实这个问题也没什么复杂的,想一想,这里的int **a;没有被初始化,ie,天知道它现在指着哪一块内存,所以直接*a=new int[n]是不安全的,但问题是,如果是诸如int *a, *a=n,原则上也是不安全的,但在编译器那却可以通过,所以推断c++里指针和其他类型还是有着不一样的地方,或者是因为这里的new……不管因为什么,显然这又是一个不解,不知何年何月才能找到答案。深深感慨学习就是知道—无知的无限循环,或者说人生就是有涨有跌的股市大盘,再或者宇宙的本质就是矛盾的……(#)@$)%

原创粉丝点击