二维数组指针的释放

Haoze 2008-11-25 12:51:54
这个是网上常见的代码:
int **p  = new int*[100];
for(int i = 0; i < 100; i ++){
p[i] = new int[10];
}


for(int i=0;i<100;i++){
delete [] p[i];
}
delete [] p;


没有问题。

但是如果这样申请的二维数组,如何释放内存?

int (*p)[10] = new int[100][10];


如果使用上面的方法的话,会run time error. delete[] p[0]之后,再去delete[] p[1]就会出错了。

为什么这样?请讲讲 原因
...全文
675 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyulong882 2011-11-16
  • 打赏
  • 举报
回复
学习了
xzm2004 2011-03-05
  • 打赏
  • 举报
回复
upup
Haoze 2008-11-29
  • 打赏
  • 举报
回复
我之前也就此问题,请教了我一个做c语言的同学,也得到了类似的见解。

所以,在我第一次回帖之后的经典答案,尤其是31楼的同学,我的可用分之后11分,不能加分了,所以只给你了25分,不要见怪。
Haoze 2008-11-29
  • 打赏
  • 举报
回复
谢谢大家。

这几天没上网,今天才来结贴。

多谢~~

好的回复太多,分太少,不知道怎么分给大家,真是遗憾。
yinghui130 2008-11-25
  • 打赏
  • 举报
回复
支持2楼和24楼
有几个new就有几个delete
cnmghi 2008-11-25
  • 打赏
  • 举报
回复
唉,其实二维就是一维,在实现上是一样的,也是delete []p;
DarknessTM 2008-11-25
  • 打赏
  • 举报
回复
反正 一种new 对应一种delete
不可能一种new 需要 多个delete……
wiowei 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 mupengzhi 的回复:]
C/C++ code
int (*p)[10] = new int[100][10]; //此为一数组指针,即P为指向10个数组的指针,每个数组的大小100字节
//数组的大小没有用new另外分配(参考第一个例子看看),所以,只须delete[] p;
[/Quote]

p是指向100个数组的指针,每个数组大小为int[10] (40字节)

int (*p)[10] = new int[100][10];
printf("%p ",p[0]);
printf("%p ",p[1]);

看下即可
lzh9955 2008-11-25
  • 打赏
  • 举报
回复
mark.学习。
bbb332 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wiowei 的回复:]
引用 2 楼 Chiyer 的回复:
C/C++ code
int (*p)[10] = new int[100][10];

相当于
typedef int array_ten[10];
array_ten* p = new array_ten[100];


UP
p是array_ten*指针数组,而array_ten数组会自己释放,因此只需 delete[] p;
[/Quote]....
wiowei 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Chiyer 的回复:]
C/C++ code
int (*p)[10] = new int[100][10];

相当于
typedef int array_ten[10];
array_ten* p = new array_ten[100];
[/Quote]

UP
p是array_ten*指针数组,而array_ten数组会自己释放,因此只需 delete[] p;
Big鹏 2008-11-25
  • 打赏
  • 举报
回复

int (*p)[10] = new int[100][10]; //此为一数组指针,即P为指向10个数组的指针,每个数组的大小100字节;
//数组的大小没有用new另外分配(参考第一个例子看看),所以,只须delete[] p;
bfhtian 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 hmsuccess 的回复:]
我觉得
还是要理解这几个关系
1,指针数组 int *c[10];
2,数组指针(即就是行指针)int (*c)[10];

大家都知道,数组在内存的存放是连续存放的(二维指针是分开的),并不是按照我们想象(表格形式)的那样存放的,
那么,在释放的时候就存在一个地址选取问题,如果按照int **p = new int*[100]或者int **p=(int** )(malloc((sizeof)(int* )*m))
的分配方式,由于这时数据的地址存放地方和数据的地址的地址本身…
[/Quote]
up
SearchLife 2008-11-25
  • 打赏
  • 举报
回复
up
Longinc 2008-11-25
  • 打赏
  • 举报
回复
delete[] p;是一个指针数组
whmouse 2008-11-25
  • 打赏
  • 举报
回复
UP
toadzw 2008-11-25
  • 打赏
  • 举报
回复
是按你指针类型来删除的,不要多作考虑;
lgccaa 2008-11-25
  • 打赏
  • 举报
回复
mark
stanboy 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 Haoze 的帖子:]
如果使用上面的方法的话,会run time error. delete[] p[0]之后,再去delete[] p[1]就会出错了。

为什么这样?请讲讲 原因
[/Quote]

delete[] p[0]等同于delete [] p,p已经不存在了,再去delete[] p[1]肯定会出错了
jieao111 2008-11-25
  • 打赏
  • 举报
回复
不用你释放
加载更多回复(19)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧