免费注册 查看新帖 |

Chinaunix

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

内存释放的简单问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-30 12:31 |只看该作者 |倒序浏览
我看一本书上有个例子这样写:

#include<iostream.h>
struct person {
                        char *name;
                        int age;
};

main()
{
  person *p;
  p=new person;
  p->name=new char[20];
  p->name="Smart";  
  p->age=20;
  cout<<"\n"<<p->name<<".  "<<p->age;
  delete p;
  return 1;
}

在这里看到首先使用了两次new
可只做了delete p;
而没有做delete p->name;
虽然我知道在做delete p;后,p->name已经不可引用了

但是不确认的是new char[20];分配的20个字节是不是已经释放了?我觉得应该没有释放

谁给个明确的答案?
谢谢。

论坛徽章:
0
2 [报告]
发表于 2008-04-30 12:34 |只看该作者
没有释放

论坛徽章:
0
3 [报告]
发表于 2008-04-30 12:52 |只看该作者
原帖由 caijimin 于 2008-4-30 12:34 发表
没有释放



事实上那20个字节就一直存在

算是内存泄漏吧?

论坛徽章:
0
4 [报告]
发表于 2008-04-30 13:25 |只看该作者

  1.   p->name=new char[20];
  2.   p->name="Smart";  
复制代码


很好。这个例子是让找错吗?

论坛徽章:
0
5 [报告]
发表于 2008-04-30 13:59 |只看该作者
原帖由 welcome008 于 2008-4-30 12:52 发表



事实上那20个字节就一直存在

算是内存泄漏吧?

是泄露,我以前也碰到过这个问题,如果还对自己的结论没信心,可以用valgrind跑一下。结果就一清二白了

论坛徽章:
0
6 [报告]
发表于 2008-04-30 14:02 |只看该作者
原帖由 熏红猴 于 2008-4-30 13:25 发表

  p->name=new char[20];
  p->name="Smart";  


很好。这个例子是让找错吗?



我只是疑问那20个字节会造成内存泄漏

还有其他错吗?

论坛徽章:
0
7 [报告]
发表于 2008-04-30 15:33 |只看该作者
new 和 delete 要成对使用的。
p->name="Smart"; 改成
用 strncpy 好一点。

论坛徽章:
0
8 [报告]
发表于 2008-05-01 00:08 |只看该作者
搞什么?这个程序至少三个地方是错误的吧。

论坛徽章:
0
9 [报告]
发表于 2008-05-03 12:49 |只看该作者
这真是本好书,介绍来看看,对大家fix bug的能力一定会有提高
你这里的20个字节不是没有释放,而是你已经无法释放了

  p->name="Smart";  
已经让你失支了这20个字节的控制权
当然了,我实在也想不出来,这p->name=new char[20];有什么存在的必要.

论坛徽章:
0
10 [报告]
发表于 2008-05-03 14:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP