一个动态2维数组指针如何删除
申请了一个动态2维数组指针
int (*temp3)[7]=new int[][7];
delete []temp3;
这样删除却有错误
debug error
DAMAGE:after normal block(#69) at 0x0049ff0
问题点数:20、回复次数:12Top
1 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2005-11-15 18:28:35 得分 1
这样也能申请二维指针?
没见过, 我试试看.Top
2 楼aglg(aglg)回复于 2005-11-15 18:33:37 得分 0
这样不能生成二维数组的吧Top
3 楼JACKEY6108(冬天的一把火)回复于 2005-11-15 18:36:36 得分 2
这样的确可以申请二维指针,
但是释放空间的时候要先释放第二维的,
要不就内存泄漏Top
4 楼liwf(一叶孤舟)回复于 2005-11-15 18:40:42 得分 2
int (*temp3)[7]=new int[][7];
这一行有误,应该是这样的吧:
int (*temp3)[7]=new int[i][7]; // i 是一正整数。Top
5 楼wangya110()回复于 2005-11-15 19:09:44 得分 5
//用二级指针可以模拟二维数组!
int i;//行
int j;//列
int * *temp=new int *[i];
for(int t=0;t<i;t++)
{
temp[i]=new int[j];
}
for(t=0;t<i;t++)
{
delete [] temp[i];
}
delete []temp;
/*注意释放内存空间时,肯定先释放第二维的!嘿嘿大家可以试试啊*/
Top
6 楼whatsouta(某疯子)回复于 2005-11-15 20:33:25 得分 5
试了一下,直接
int (*temp3)[7]=new int[][7];
这样无法申请
[C++ Error] Unit1.cpp(14): E2034 Cannot convert 'int ( *)[1]' to 'int ( *)[7]'
不知道楼主是什么环境下搞的,应该和编译器的实现有关了。
我是在BCB6+WIN2K
不过从语法来看,数组的大小应该是可以确定的:7 * 7。因而,这样申请空间是可行的。
另外,删除指针的时候,M维数组应该自行释放从第M维到第2维的空间,最后释放第1维空间。
Top
7 楼whatsouta(某疯子)回复于 2005-11-15 20:59:53 得分 3
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int m = 5;
int (*tmp)[7] = new int[m][7];
int k = 0;
for (int i = 0; i < m; ++i)
for (int j = 0; j < 7; ++j)
tmp[i][j] = ++k;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < 7; ++j)
printf("%4d", tmp[i][j]);
printf("\n");
}
for (int i = 0; i < 7; ++i) // *1
delete [] tmp[i]; // *2 这里会出错
delete [] tmp;
system("pause");
return 0;
}
上面这个程序
如果保留第*1、*2二行,则无法释放空间,提示访问内存错误。
如果去掉则可以正常退出。Top
8 楼whatsouta(某疯子)回复于 2005-11-15 21:00:42 得分 0
盼望有高手来指点一二Top
9 楼zenny_chen(ACE Intercessor)回复于 2005-11-15 21:30:51 得分 2
你用int (*tmp)[7] = new int[m][7];
说明是为指向元素个数为7的数组指针进行动态分配空间。很显然,被动态分配的仅仅是tmp,即int(*)[7]类型的指针。而tmp[i]并没有被动态分配。
除非你用int **tmp; tmp = new int*[m]; for(int i=0; i<m ;i++)tmp[i] = new int[7];
这样,你就可以用delete[] tmp[i]了。因为除了tmp以外,tmp[i]也被动态分配了。Top
10 楼xbt746(头上无毛)回复于 2005-11-15 21:33:29 得分 0
明白了Top
11 楼zenny_chen(ACE Intercessor)回复于 2005-11-15 21:36:59 得分 0
int (*tmp)[7] = new int[m][7];
然后用delete[] tmp; 并不会造成内存泄漏。因为该delete的已经delete了。
原因很简单。因为tmp是指向int[7]类型的指针,即int(*)[7]类型。因此只要将第一维即动态分配的那维(也就是int[7]数组的地址)删掉,那么第二维当然会跟着被删除。Top
12 楼xbt746(头上无毛)回复于 2005-11-15 21:40:38 得分 0
用的是VC6.0Top




