user-0 提问: 开辟连续动态三维数组内存

回复:
user: user-0
content: 刚证明了这两种方式定义三维数组都行，我现在想知道为什么float ***smat=NULL;     smat=new float **[NX];     if(!smat)     {       return 0;     }     smat[0]=new float *[NX*NY];     if(!smat[0])     {       delete smat;       return 0;     }     smat[0][0]=new float [NX*NY*NZ];     if(!smat[0][0])     {       delete smat;       delete smat[0];       return 0;     }     memset(smat[0][0],0,sizeof(float)*NX*NY*NZ);     for(int i=1;i<NX;i++)     {       for(int j=1;j<NY;j++)       {         smat[i-1][j]=smat[i-1][j-1]+NZ;       }     } 之后再进行释放 if(!smat)     {       return 0;     }     delete []smat[0][0];     smat[0][0]=NULL;     delete []smat[0];     smat[0]=NULL;     delete smat;     smat=NULL; 这种定义到底是那写错了，申请连续的NX*NY*NZ空间老是出错

user: user-0
content: 按你说的那样改了，可是发现用你那样申请和我这样申请仍然是有区别，不知道为什么？

user: user-1
content: 因为： 引用 6 楼 juantingjun 的回复:我想说为什么不可以这样 int ***p=new int **[z]; for(int i=0;i<z;i++) { p[i]=new int *[y]; for(int j=1;j<x;j++)  //首先数组起始下标是0，其次p[i]包含是Y个元素，而不是X个 {                     //所以，应该是for(int j = 0; j < y; ++j) p[i][j]=new int [x]; } } 释放： for(i=0;i<z;i++) { for(j=0;j<y;j++) { delete [] p[i][j]; } delete []p[i]; } delete [] p;我想知道我这种申请和你那种申请有什么区别吗？

user: user-0
content: 我想说为什么不可以这样 int ***p=new int **[z]; for(int i=0;i<z;i++) { p[i]=new int *[y]; for(int j=1;j<x;j++) { p[i][j]=new int [x]; } } 释放： for(i=0;i<z;i++) { for(j=0;j<y;j++) { delete [] p[i][j]; } delete []p[i]; } delete [] p;我想知道我这种申请和你那种申请有什么区别吗？

user: user-0
content: 大家好。上面有些地方不小心写错了，下面才是对的，之前我用以下方法开辟了连续二维动态数组   float **st=NULL;     s=new float *[NU];;     if(!s)     {       return 0;     }     s[0]=new float [NU*NV];     if(!sinomat)     {       delete s;       return 0;     }     memset(s[0],0,sizeof(float)*NV*NU);     for(int i=1;i<NU;i++)     {       s[i]=s[i-1]+NV;     } 然后再释放 if(!s )     {       return 0;     }     delete [] s[0];     s[0]=NULL;     delete [] s;     s=NULL;    这个放到程序中运行没有错。 之后再用类似的方法开辟动态三维数组形如： float ***smat=NULL;     smat=new float **[NX];     if(!smat)     {       return 0;     }     smat[0]=new float *[NX*NY];     if(!smat[0])     {       delete smat;       return 0;     }     smat[0][0]=new float [NX*NY*NZ];     if(!smat[0][0])     {       delete smat;       delete smat[0];       return 0;     }     memset(smat[0][0],0,sizeof(float)*NX*NY*NZ);     for(int i=1;i<NX;i++)     {       for(int j=1;j<NY;j++)       {         smat[i-1][j]=smat[i-1][j-1]+NZ;       }     } 之后再进行释放 if(!smat)     {       return 0;     }     delete []smat[0][0];     smat[0][0]=NULL;     delete []smat[0];     smat[0]=NULL;     delete smat;     smat=NULL; 结果一直有内存泄漏的错误。哪位大牛能不能告诉我到底是那错了，要怎么才能开辟出连续的动态三维数组空间。

user: user-1
content: 没细看lz的代码，假如你想申请一个三维数组类似这样的结构T array[Z][Y][X]，则可以：  //动态申请 T*** array = new T** [Z]; for(i = 0; i < Z; ++i) array[i] = new T* [Y]; for(i = 0; i < Z; ++i){     for(j = 0; j < Y; ++j) array[i][j] = new T[X]; } //释放，实际上是逆运算，三个new[]对应三个delete[]，而且是后new的要先delete for(i = 0; i < Z; ++i){     for(j = 0; j < Y; ++j){         delete[] array[i][j];         array[i][j] = NULL;    //作为一个好习惯，可以加上这个     } } for(i = 0; i < Z; ++i){     delete[] array[i];     array[i] = NULL;    //作为一个好习惯，可以加上这个 } delete[] array; array = NULL;    //作为一个好习惯，可以加上这个

user: user-2
content: 释放的顺序是申请的出栈，

user: user-0
content: 确实在这样的啊，先申请一个内存空间，再对它进行初绐化，最后释放的时候也是从里到外啊，为什么申请二维动态空间可以，三维就出现内存泄漏呢

user: user-3
content: 开辟内存空间 从外到里  释放内存空间 从里到外！