用new创建多维数组时,最后需要用delete,但是我在delete时遇到了麻烦,实在不能再浪费时间了,先mark一下,至少创建多维数组这段是对的
以int型数组为例,我们知道
一维数组 int a[4] ={1,2,3,4};
二维数组 int b[3][4] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4}
三维数组 int c[2][3][4] = {1,2};
那么用new方式如何创建呢
一维数组有
int *p1 = new int[4];
二维数组有
int (*p2)[4] = new int[3][4];
三维数组
int (*p3)[3][4] = new int[2][3][4];//两维三行四列
同样的四位数组
int (*p4)[2][3][4] = new int[1][2][3][4];//不知道怎么叫了
忘了从哪里看到的说: 从二维数组开始,定义并不是写成 int *p2[4]、int * p3[3][4]、...这是因为int * p2[4]表示定义一个数组p2,该数组是int *型,数组内的每个元素都是指向int型的指针。
//step 1定义多维数组
//int *q1 = new int[4]; //创建一维数组,暂时不用
//int (*q2)[4] = new int[0][4];//创建二位数组,暂时不用
int (*p)[3][4] = new int[2][3][4];//创建三维数组,本文研究的重点,我为了少打字,这个变量我定义成了p,并不是p3
//int (*p4)[3][4][5] = new int [0][3][4][5];//创建四维数组
//留个标记,用于
//存放这些数组的指针,用于验证是否delete时会用到
int *backup[24];
int imark = 0;
//循环将三维数组每个元素均赋值为1
printf("------初始化得到的二维数组----\n");
for(int i = 0;i< 2;i++)
{
for(int j = 0;j<3;j++)
{
for(int k = 0;k<4;k++)
{
printf("%d --->",(*(*(p+i)+j)+k));//初始化之前均为0
printf("%d ",*(*(*(p+i)+j)+k));//这里打印了new出来的三维数组,本层循环最后将每个值赋值成了1
backup[imark++] = (*(*(p+i)+j)+k);
*(*(*(p+i)+j)+k) = 1;//这里将每个元素赋值成了1,为的是方便后面delete时对比查看
}
printf("\n");
}
}
printf("---------------------\n");//
//step 2 准备检验
//前辈说书中讲的,数组的大小在之前的四个字节内存储着,究竟是啥呢,在这里可以打印查看printf("front 4 byte is %d, -->%d\n",&p[0][0][0]-1,(int)*(&p[0][0][0]-1));printf("p[0][0][0] address is %d\n",&p[0][0][0]);printf("p[1][2][3] address is %d\n",&p[1][2][3]);printf("\n");//这里尝试了好多种delete的方式都没有成功???╮(╯▽╰)╭
//第一种尝试,直接删除p数组,这个似乎从原理上很容易否定
/*
delete []p;//这种方式发现只删除了new出来的前两个元素
*/
//第二种尝试,借用一下保存的指针,用指针一个一个去free
/*
for(int i =0;i<24;i++)
{
delete backup[i];//用backup中记忆的位置一个一个删除,发现行不通,&backup[i]也行不通
//delete []backup;//这种也是行不通的,我注解上了,可以试试
}
*/
//第三种尝试,嵌套进入生成的数组,一层一层的去free,然而依然失败,不知道是重复删除了,还是怎么了,感觉是重复删除了
for(int i = 0;i<2;i++)
{
for(int j = 0;j<3;j++)
{
delete [] p[i][j];
}
delete []p[i];
}
//第四种尝试,一个一个删,但依然没有成功,我从大到小,先小到大均试了一次,依然失败,下面写的是从大到小
/*
delete p[1][2][3];//不要搞混乱,2*3*4维数组最大值就是这个
delete p[1][2][3];//不列写了,因为占篇幅,可以肯定的是没成功
//...
delete p[0][0][0];
*/
//这里面检查是否已经delete了
for (int i = 0; i < 24; i++) {
if ((i != 0) && (i % 4 == 0))
{
printf("\n");
}
printf("[%d]%d--->%d ", i, backup[i], (int) *backup[i]);
}
printf("\n");
return 0;
我目前gdb方式还不会看,另外delete还学得不够深入,再钻进去周末别的也就看不成了,所以得先记下。
另外粘一个别人new三维数组的方法
int*** a= new int**[5];
for (int i = 0; i < 5; ++i)
{
a[i] = new int*[6];
for (int j = 0; j < 6; ++j)
{
a[i][j] = new int[7];
}
}
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 6; ++j)
{
delete[] a[i][j];
}
delete[] a[i];
}
delete[] a;
就先到这里吧