CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

char *p与内存泄漏

楼主itbear(Victor)2006-12-01 00:33:17 在 C/C++ / C语言 提问

(1)  
  char   *p   =   new   char[20];  
  p   =   "abc";  
   
  (2)  
  char   *p   =   "abc";  
  p   =   "xyz";  
   
   
  请问各位,以上(1)和(2)两种情况是否都会导致内存泄漏?如何修改才能避免?请详解。 问题点数:20、回复次数:12Top

1 楼axx1611(long long *&ago)回复于 2006-12-01 00:40:11 得分 5

1会2不会  
  正确的为:  
  char   *p   =   new   char[20];  
  strcpy(p,   "abc");  
  ...  
  delete   []   p;  
  Top

2 楼itbear(Victor)回复于 2006-12-01 00:46:46 得分 0

为什么(2)不会?不是指针a先指向“abc”,然后a又指向“xyz”,这两个字符串不是地址不同吗?  
  难道p   ="xyz";这句是把"xyz"拷贝到原来"abc"分配的内存单元中吗?Top

3 楼kenneth_lueng()回复于 2006-12-01 08:13:59 得分 5

内存泄漏指的是堆内存泄漏(heap)  
  char   *p   =   "abc";   //只是从栈中分配内存,系统会自动回收资源  
  p   =   "xyz";    
   
  "abc"   和   "xyz"都是常量字符串,是在常量区分配的,并不是堆中分配  
   
  Top

4 楼jackexu()回复于 2006-12-01 08:21:47 得分 2

简单的来说,用new分配的空间,结束前一定要释放,不然会泄露,  
  2没有Top

5 楼myfriend023()回复于 2006-12-01 08:33:58 得分 2

char   *p   =   new   char[20];  
  用new分配空间   并不给所分配的空间赋值  
  p   =   "abc";这里已经把p指向了常量区的一块地址   p已经不再指向原来用new分配的堆地址   所以原来的new的   没有指针记录的话   你用delete就释放不了了  
  Top

6 楼axx1611(long long *&ago)回复于 2006-12-01 09:16:17 得分 2

kenneth_lueng(kenneth)意思说对了,不过有一点,"abc"   和   "xyz"并不是分配到“常量区”(阁下是想说数据段??),而是分配在附加段里  
  而p这个指针的四个字节在栈中分配,由于附加段和栈都是固定大小,所以不存在memory   leak的问题。Top

7 楼shawnwan()回复于 2006-12-01 09:26:04 得分 1

2不会,2没指向NEW的数据,  
  另  
  DELETE   P   后记得   P   =null可以减少出错的机会Top

8 楼my_web(交流qq:517664276)回复于 2006-12-01 09:39:37 得分 0

1会2不会,原因同上Top

9 楼augustusqing(喜欢雨路的火焰狼)回复于 2006-12-01 09:40:26 得分 0

看来楼主跟我几天前一样,对堆,栈,常量区分得比较迷糊,:)Top

10 楼todototry(来csdn,学会扯淡了...)回复于 2006-12-01 09:41:40 得分 3

(1)  
  char   *p   =   new   char[20];  
  p   =   "abc";  
   
  (2)  
  char   *p   =   "abc";  
  p   =   "xyz";  
  =======================  
  (1)p拿到20个字符的一块内存的地址,然后又指向常量区的“abc”,所以把申请的内存的地址丢掉了,怎么释放,所以泄漏  
  (2)p是一个指针变量,首先指向常量区的“abc”,然后又指向常量区的“xyz”,常量区的数据,编译器负责的,所以并不需用户管理Top

11 楼kenneth_lueng()回复于 2006-12-01 10:27:48 得分 0

to   axx1611(long   long   *&ago)    
   
  其实字符具体分配在什么地方,可能也跟编译器有关,而且说法也很多种  
  按阁下的说法,应该是有点在差不多汇编的角度来看了,不知说得对不对   :)  
   
  而现在大多的针对C   或者   C++来说,基本上把这些数据段统称为常量区  
  再细一点可以称为“文字常量区”Top

12 楼axx1611(long long *&ago)回复于 2006-12-01 12:43:24 得分 0

to   LS:  
  呵呵  
  如果将其称为“静态区”可能会跟容易让我接受,因为const类型的数据有可能就是在栈中的,说“常量区”未免有点名不副实。  
   
  不过不管是什么区,楼主的问题都是回答对了。。  
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:itbear
  • axx1611
  • kenneth_lueng
  • jackexu
  • myfriend023
  • axx1611
  • shawnwan
  • todototry

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo