C++中动态申请与释放二维数组
C++中比较麻烦的就是动态的对内存的操作,有的时候new了,没有delete,造成内存泄露;有的时候没有正确地new,造成空指针、野指针的使用,导致数据被破坏,程序异常。
先看看下面一段代码:
申请内存:
[cpp]
float** a;
a= new float*[5];
for (j=0; j<5; j++)
{
a[j] = new float[2];
}
float** a;
a= new float*[5];
for (j=0; j<5; j++)
{
a[j] = new float;
}
释放内存:
[cpp]
for (i=0; i<5; i++)
{
delete[] a[i];
a[i]=NULL;
}
delete[] a;
a=NULL;
申请的时候,一个是a[j] = new float[2];一个是a[j] = new float;
这2种,有什么区别?有什么问题?
首先正确的写法是a[j] = new float[2],错误的写法是a[j] = new float;
从代码的效果上来说,前者a[j]是指向有2个float类型的元素的指针,后者是一个指向float类型的指针,没有说明具体有多少个元素,也就是说在下面操作的时候,实际上是操作了野指针,同时在调用delete的时候,也会异常。
[cpp]
[cpp]
a[0][0]=2;
a[0][1]=4;
a[1][0]=1.5;
a[1][1]=6;
a[2][0]=0.5;
a[2][1]=3.5;
a[3][0]=5;
a[3][1]=7;
a[4][0]=7.5;
a[4][1]=9;
执行的时候,不会有异常,但是在程序退出的时候,如果调用delete则:
如果不调用delete,调试运行可以发现有内存泄露:
所以a[j] = new float;是错误的。
总结一下,正确的申请和释放:
#define M 10 //行数
#define N 8 //列数
申请:
[cpp
float** a;
a= new float*[M];
for (j=0; j<M; j++)
{
a[j] = new float[N];
}
赋值:
[cpp]
for (i=0; i<M; i++)
{
for (j=0; j<N; j++)
{
a[i][j] = i*j;
}
}
释放:
[cpp]
for (i=0; i<M; i++)
{
delete[] a[i];
a[i]=NULL;
}
delete[] a;
a=NULL;
说明:float换成int类型,效果也一样。
补充:软件开发 , C++ ,