我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: 一个C++里资源管理的小问题 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ negative /'negətiv/ a. 否定的,拒绝的,反面的,消极的,阴性的,负的;n. 底片,负数 ]


一个C++里资源管理的小问题

刚刚在写一小程序,发现了一个问题,弄了半天,才发现自已错在哪
共享一下。
下面是问题的简化

int main(int argc, char **argv)
{
    char *p = new char[sizeof("hello,world")];
    strcpy(p,"hello,world");
    delete[] p;

    return 0;
}
运行后,会出现错误,不能执行下去。
跟踪了后现在delete 这里出问题了。
开始不思其解
如果去掉strcpy(p,"hello,world");这一句问题就没了
跟踪delete发现确实是里面错了。
后来改了一下
char *p = new char[sizeof("hello,world") + 1];
问题解决了。

思考:
开始一直以为delete这个语句执行时会查new 申请的情况,然后再来delete
但是却发现没有,如 delete字符串只是 delete 到字符串的0x0处。
这样的内存管理应该是存在问题的,可能会造成内在泄露,或都出现我上面的问题。
如果用查表技术,每次new时把其申请的内存地址及申请空间大小存入一个表中
下次delete时只要查一下表就可以不会造成上面的问题了。

当然这样效率可能会低一点。估计是C++将这个问题丢给用户自已去解决了。

刚刚接触C++,以前都是用C的。
看来C++的博大不是一会就能体会得到了。


[ 此贴被zhoubaozhou在2007-08-23 21:36重新编辑 ]
顶端 Posted: 2007-08-23 20:56 | [楼 主]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ compose /kəm'pəuz/ vt. 构成,组成,创作(乐曲、文学作品等 ]


发现在我的VC6.0上没有问题.
p[sizeof("hello,world")] = 0x0;这句是错的吧
顶端 Posted: 2007-08-24 16:23 | [1 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ organ /'o:gən/ n. 器官,机构,风琴 ]


Quote:
引用第21楼zhoubaozhou于2007-08-24 16:30发表的  :


没有,我就是要破坏字符串0x0后那一个字节,这样delete就会出错了
编译是没问题的
运行会出错

我记得那个标志是在前边的吧?
你看一下内存就知道了,你强改了之后,那个标志没有变的,
感觉后边delete就是因为标志没有变长而出错.
远程图片:111.JPG 远程图片:222.JPG
顶端 Posted: 2007-08-24 19:16 | [2 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.010602(s) query 6, Time now is:11-23 09:18, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号