首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
C/C++
C++ 语言
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
字符串内存的释放问题
[已结贴,结贴人:wxq888]
加为好友
发送私信
在线聊天
wxq888
我要我要我就要我还要
等级:
发表于:
2008-05-21 18:13:45
楼主
char * str = new(Eleave) char[20];
下面两种释放str 的内存空间的写法,那种正确,
delete str;
delete []str;
在机子上测试两种方法都一样可以释放?为什么一样?
问题点数:
20
回复次数:
18
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
clhposs
Poss
等级:
发表于:
2008-05-21 18:15:03
1
楼 得分:
0
C/C++ code
delete str;
//
释放一个对象
delete []str;
//
释放一群对象
//
好像是这样
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
dyx1024
传说中的Socrates
等级:
发表于:
2008-05-21 18:21:57
2
楼 得分:
3
因为是char*,你换成别的类型就不行了.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
leelittlelong
小龙
等级:
发表于:
2008-05-21 18:23:36
3
楼 得分:
3
简单类型的数组 可以用delete xx来释放。
复杂对象的数组,必须用delete[] xx来释放。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hpj2000
编程爱好者
等级:
发表于:
2008-05-21 18:43:24
4
楼 得分:
0
delete str 是释放数组第一个元素所占内存。(因为数组名表示数组第一个元素的地址)
delete []str 是释放数组所有元素所占内存。 (此处相当于释放字符串str的内存)
个人认为应该使用第2种方法比较好。。第1种方法容易造成内存泄露。。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
HikerLive
等级:
发表于:
2008-05-21 18:55:52
5
楼 得分:
0
当需要释放给一个数组分配的内存空间时,常常采用带中括号[ ]的形式,这样释放得
会更干净。而采用不带中括号[ ]的方式,可能只释放了一部分的内存空间
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lyle3
小崔
等级:
发表于:
2008-05-21 23:56:10
6
楼 得分:
0
引用 4 楼 hpj2000 的回复:
delete str 是释放数组第一个元素所占内存。(因为数组名表示数组第一个元素的地址)
delete []str 是释放数组所有元素所占内存。 (此处相当于释放字符串str的内存)
个人认为应该使用第2种方法比较好。。第1种方法容易造成内存泄露。。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
AtomII
一切随风好了
等级:
发表于:
2008-05-21 23:59:07
7
楼 得分:
0
delete str;
delete []str;
对第一个元素释放,也就是头地址释放,其他并没有
后一个是整个字符串都被释放
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
kingstarer
等级:
发表于:
2008-05-22 00:15:09
8
楼 得分:
4
以前也问过类似的问题,得到的答复是,虽然有些编译器里面效果是一样的,但最好不要这样,应该此行为未定义。
另外,如果delete的是个类数组,并且该类含有析构函数就会出现不同了,delete[]不会调用除第一个类数组元素外的析构函数
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yuzl32
有酒醉
等级:
发表于:
2008-05-22 00:48:33
9
楼 得分:
0
引用 8 楼 kingstarer 的回复:
以前也问过类似的问题,得到的答复是,虽然有些编译器里面效果是一样的,但最好不要这样,应该此行为未定义。
另外,如果delete的是个类数组,并且该类含有析构函数就会出现不同了,delete[]不会调用除第一个类数组元素外的析构函数
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
WingForce
所有人都是蛤蟆,只是井的大小有区别
等级:
发表于:
2008-05-22 06:35:53
10
楼 得分:
3
Symbian???
貌似正确的做法还需要CleanupStack
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
coding_hello
coding
等级:
发表于:
2008-05-22 06:52:10
11
楼 得分:
0
不同的编译器,行为会有所不同.
正确的做法是单个对象用delete释放, 数组对象用delete[]释放.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yndfcd
YNDFCD
等级:
发表于:
2008-05-22 09:41:43
12
楼 得分:
0
Placement new产生出来的内存不需要释放.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
WingForce
所有人都是蛤蟆,只是井的大小有区别
等级:
发表于:
2008-05-22 14:15:23
13
楼 得分:
0
引用 12 楼 yndfcd 的回复:
Placement new产生出来的内存不需要释放.
关于那个Eleave,不是Placement new,Symbian中规定这样的写法
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
mujiok2003
等级:
发表于:
2008-05-22 14:23:24
14
楼 得分:
0
第二个是正确的,第一个内存泄露鸟
delete [] str;
str = NULL;
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
endlessdream
等级:
发表于:
2008-05-22 14:36:01
15
楼 得分:
0
delete str; //释放一个对象
delete[] str; //释放一组对象
既然一开始申明的是一个字符串数组就要用第二个
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
snailman
一辈子
等级:
发表于:
2008-05-22 14:57:59
16
楼 得分:
3
delete str; //释放一个对象
delete[] str; //释放一组对象
对于内部类型这两种都一样,但是对于自定义类型就得遵守上面得写法~!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lziog
dragon
等级:
发表于:
2008-05-22 14:58:03
17
楼 得分:
4
char * str = new(Eleave) char[20];
delete str;
delete []str;
delete [20]str;
三种释放方法是一样的,delete []str;是对delete str;前者的一种改进,delete [20]str;是三种方法中效率最好的一种当然你事先要知道它有几个元素.不是太好控制.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
frank_323
学习
等级:
发表于:
2008-05-22 15:18:58
18
楼 得分:
0
学习
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友