首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 字符串内存的释放问题 [已结贴,结贴人:wxq888]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wxq888
    • 等级:
    发表于:2008-05-21 18:13:45 楼主
    char * str = new(Eleave) char[20];

    下面两种释放str 的内存空间的写法,那种正确,
    delete str;
    delete []str;

    在机子上测试两种方法都一样可以释放?为什么一样?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:15:031楼 得分:0
    C/C++ code
    delete str; //释放一个对象 delete []str; //释放一群对象 //好像是这样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dyx1024
    • 等级:
    发表于:2008-05-21 18:21:572楼 得分:3
    因为是char*,你换成别的类型就不行了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:23:363楼 得分:3
    简单类型的数组 可以用delete xx来释放。

    复杂对象的数组,必须用delete[] xx来释放。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:43:244楼 得分:0
    delete str      是释放数组第一个元素所占内存。(因为数组名表示数组第一个元素的地址)
    delete []str    是释放数组所有元素所占内存。  (此处相当于释放字符串str的内存)
    个人认为应该使用第2种方法比较好。。第1种方法容易造成内存泄露。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:55:525楼 得分:0
    当需要释放给一个数组分配的内存空间时,常常采用带中括号[ ]的形式,这样释放得
    会更干净。而采用不带中括号[ ]的方式,可能只释放了一部分的内存空间
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 23:56:106楼 得分:0
    引用 4 楼 hpj2000 的回复:
    delete str      是释放数组第一个元素所占内存。(因为数组名表示数组第一个元素的地址)
    delete []str    是释放数组所有元素所占内存。  (此处相当于释放字符串str的内存)
    个人认为应该使用第2种方法比较好。。第1种方法容易造成内存泄露。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AtomII
    • 等级:
    发表于:2008-05-21 23:59:077楼 得分:0
    delete str;
    delete []str;
    对第一个元素释放,也就是头地址释放,其他并没有
    后一个是整个字符串都被释放
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 00:15:098楼 得分:4
    以前也问过类似的问题,得到的答复是,虽然有些编译器里面效果是一样的,但最好不要这样,应该此行为未定义。

    另外,如果delete的是个类数组,并且该类含有析构函数就会出现不同了,delete[]不会调用除第一个类数组元素外的析构函数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 00:48:339楼 得分:0
    引用 8 楼 kingstarer 的回复:
    以前也问过类似的问题,得到的答复是,虽然有些编译器里面效果是一样的,但最好不要这样,应该此行为未定义。

    另外,如果delete的是个类数组,并且该类含有析构函数就会出现不同了,delete[]不会调用除第一个类数组元素外的析构函数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WingForce
    • 等级:
    发表于:2008-05-22 06:35:5310楼 得分:3
    Symbian???

    貌似正确的做法还需要CleanupStack
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 06:52:1011楼 得分:0
    不同的编译器,行为会有所不同.

    正确的做法是单个对象用delete释放, 数组对象用delete[]释放.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 09:41:4312楼 得分:0
    Placement new产生出来的内存不需要释放.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WingForce
    • 等级:
    发表于:2008-05-22 14:15:2313楼 得分:0
    引用 12 楼 yndfcd 的回复:
    Placement new产生出来的内存不需要释放.

    关于那个Eleave,不是Placement new,Symbian中规定这样的写法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 14:23:2414楼 得分:0
    第二个是正确的,第一个内存泄露鸟
    delete [] str;
    str = NULL;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 14:36:0115楼 得分:0
    delete str; //释放一个对象
    delete[] str; //释放一组对象
    既然一开始申明的是一个字符串数组就要用第二个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 14:57:5916楼 得分:3
    delete str; //释放一个对象
    delete[] str; //释放一组对象

    对于内部类型这两种都一样,但是对于自定义类型就得遵守上面得写法~!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 14:58:0317楼 得分:4

    char * str = new(Eleave) char[20];
    delete str; 
    delete []str;
    delete [20]str;

    三种释放方法是一样的,delete []str;是对delete str;前者的一种改进,delete [20]str;是三种方法中效率最好的一种当然你事先要知道它有几个元素.不是太好控制.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 15:18:5818楼 得分:0
    学习
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved