当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,