免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10541 | 回复: 27
打印 上一主题 下一主题

指针数组释放的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-04 16:18 |只看该作者 |倒序浏览
char **p = NULL;
     p = (char **) new char[4];   //(1)

     p = new char* [4];//(2)

     for(int i = 0;i< 4; i++)
             delete[] p;
     delete[]  p;   //(3)
其中1,2不同时写入程序。
问题是,如果写成(2) 那么程序能够正确执行。这样写程序很好理解。
        但是我今天在网上见到有人写成是(1)的样子的,程序能够通过编译,但执行时有问题。这时如果去掉(3) delete[] p; 就能够正确运行。
        1,2两种写法区别是什么呢?
            写成1的时候为什么delete[] p; 就不对了呢?

[ 本帖最后由 hanbing5299 于 2006-4-5 10:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-04-04 16:54 |只看该作者
请大侠们指点。

论坛徽章:
0
3 [报告]
发表于 2006-04-04 23:25 |只看该作者
原帖由 hanbing5299 于 2006-4-4 16:18 发表
char **p = NULL;
     p = (char **) new char[4];   //(1)

     p = new char* [4];//(2)

     for(int i = 0;i< 4; i++)
             delete[] p;
   ...


1.  p = (char **) new char [4] 就是多了个强制类型转化而已。 实际还是申请了4个char的空间。

论坛徽章:
0
4 [报告]
发表于 2006-04-05 08:37 |只看该作者
空间一样大,但是看1很郁闷,可能有的环境有用吧。new也是个运算符号,前面如何转化本质上应该和前面没什么关系。

论坛徽章:
0
5 [报告]
发表于 2006-04-05 08:46 |只看该作者
(char **)new char[4]
我也认为是强转,但是为什么这样写的时候,delete[] p[i];之后,再delete[] p;就不对了呢?

论坛徽章:
0
6 [报告]
发表于 2006-04-05 09:20 |只看该作者
因为new返回的是void *型,所以,经过隐式的或者显式的转换,可以付值给任何一个指针

但是在使用的时候,每种指针当然是不一样的了!!!!

所以在使用的时候一定会出错。

char和char* 占用的内存空间,一般是不一样大的!!!

体会一下吧,这种东西,我能理解,但是不会讲,Sorry

论坛徽章:
0
7 [报告]
发表于 2006-04-05 10:19 |只看该作者
刚刚发现一个很奇怪的问题,我在for循环里写的是delete[] p[i] 发上去怎么就变成 p 了呢???


太神奇了!呵呵

楼上的,你的意思是不是new char [4]之后,强转成char **,但是在释放的时候还是以char 来释放的呀?所以释放两次是不对的?
而new char *[4]本身就是char **,所以可以释放两次?

论坛徽章:
0
8 [报告]
发表于 2006-04-05 10:20 |只看该作者

  1. p = (char**)new char[4];申请了4个字节的空间
  2. p = new char*[4];申请了16个字节的空间

  3. 对于 p = (char**)new char[4]使用delete[] p;是可以的
  4. 至少在我的环境里可以^_^(win2k pro sp4 + vc6无补丁)
复制代码

论坛徽章:
0
9 [报告]
发表于 2006-04-05 10:23 |只看该作者

  1. 汗,楼主原来是delete p[i]不行
  2. 这个参考我的前半部分就行了
复制代码

论坛徽章:
0
10 [报告]
发表于 2006-04-05 10:36 |只看该作者
好了好了,LZ回去看看new的语法和二级指针的概念,我实在有点看不下去了...

正确的写法应该是:

  1.      char **p = NULL;
  2.      p = new char* [4];
  3.      delete[]  p;

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP