CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

内存........谁都知道我给分的信誉是最好的。

楼主acute(毛头)(食堂帅哥)2000-12-28 19:26:00 在 VC/MFC / 基础类 提问

用malloc分配的内存用释放吗?  
  如果用,如何去做?  
  如果不用,为什么? 问题点数:60、回复次数:38Top

1 楼Rechard_G(步行者)回复于 2000-12-28 19:32:00 得分 1

VC运行库参考手册说用free释放Top

2 楼acute(毛头)(食堂帅哥)回复于 2000-12-28 19:33:00 得分 0

to   Rechard_G:  
  你试过吗?好象不行哦。Top

3 楼Virtual(hactech.51.net)回复于 2000-12-28 19:35:00 得分 1

freeTop

4 楼xiner(叉叉)回复于 2000-12-28 19:36:00 得分 1

当然要了.用free()  
  如下;  
  char*   i=malloc(12);  
  ....  
  free(i);Top

5 楼acute(毛头)(食堂帅哥)回复于 2000-12-28 19:39:00 得分 0

to   xiner:  
  你的语句char*   i=malloc(12);是错误的。  
   
  to   Virtual:  
  似乎不行啊,贴个例程出来好吗?Top

6 楼acute(毛头)(食堂帅哥)回复于 2000-12-28 19:42:00 得分 0

to   xiner:  
  要知道malloc返回的是void   *类型,而i是char   *   啊!  
   
  然后调用free,在运行时会报错。Top

7 楼jadedrip(翡翠水滴)回复于 2000-12-28 20:01:00 得分 1

用   new   ,   delete   不好吗?现在谁还用malloc。(为什么我的脸上黏忽忽的?呀!臭鸡蛋……)Top

8 楼prefix(MtSC)回复于 2000-12-28 20:25:00 得分 2

char   *i=(char   *)malloc(12);  
  free(i);  
  应该这样吧。Top

9 楼acute(毛头)(食堂帅哥)回复于 2000-12-29 00:32:00 得分 0

to   prefix:  
  你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。  
  Top

10 楼sxbyl(sxbyl)回复于 2000-12-29 08:33:00 得分 2

Faint!!  
  MSDN上不是有例子吗?  
  /*   MALLOC.C:   This   program   allocates   memory   with  
    *   malloc,   then   frees   the   memory   with   free.  
    */  
   
  #include   <stdlib.h>                   /*   For   _MAX_PATH   definition   */  
  #include   <stdio.h>  
  #include   <malloc.h>  
   
  void   main(   void   )  
  {  
        char   *string;  
   
        /*   Allocate   space   for   a   path   name   */  
        string   =   malloc(   _MAX_PATH   );  
        if(   string   ==   NULL   )  
              printf(   "Insufficient   memory   available\n"   );  
        else  
        {  
              printf(   "Memory   space   allocated   for   path   name\n"   );  
              free(   string   );  
              printf(   "Memory   freed\n"   );  
        }  
  }  
  Top

11 楼mmmyyyaaa(编程浪子)回复于 2000-12-30 22:42:00 得分 2

malloc和free配对使用  
  new和delete配对使用  
   
  这是M$的规定,好象具体的操作有些差异Top

12 楼horris(僧推月下门)回复于 2000-12-31 00:27:00 得分 2

to   sxbyl:  
  M$的例子经常有错,应该有free配对使用,但对此例,如没有free,也不会造成内存遗漏,因为当进程停止时,它所申请的所有内存被自动释放。其它情况可就糟糕了。Top

13 楼No9(华龙)回复于 2000-12-31 12:16:00 得分 1

当然是使用free()了,我想你不成功的原因可能是你没有保存malloc()所分配的指针地址,或者在其它地方改变了它的值(我就遇到这种问题),仅作参考!  
  Top

14 楼gameboy999(-'_'-)回复于 2000-12-31 12:25:00 得分 2

to   horris:  
  真的会自动恢复吗??  
  如果WinX系列有这么聪明,那memory   leaking是怎么出现的??  
   
  有malloc就有free,  
  有new就必有delete!  
  这是应付一切系统的好方法。反正错不了。Top

15 楼gameboy999(-'_'-)回复于 2000-12-31 12:33:00 得分 1

char   *i=(char   *)malloc(12);  
  free(i);  
  应该这样吧。    
     
  回复人:acute(2000-12-29   0:32:00)     得0分    
  to   prefix:  
  你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。  
  /*  
  好象系统为了使内存分配更有合理性,要求每次分配必须是某个值的整数倍  
  所以这样写就行了  
  #define   chunk_size   8     //假定为必须为8的整数倍,事实上确实winx确实要求为8  
  char   *i=(char   *)malloc(chunk_size*_MAXNUM);  
  free(i);  
  //ok,不会出错了!*/  
  上面仅为猜想,如有更好解释,请记得告诉我。  
   
  Top

16 楼yoci(阿呸)回复于 2000-12-31 13:44:00 得分 1

char   *i   =   (char   *)malloc(12*sizeof(char));Top

17 楼acute(毛头)(食堂帅哥)回复于 2001-01-02 08:51:00 得分 0

to   every:  
  人太多了,加点分。元旦没上来,耽误了。  
  to   gameboy999  
  8自然可以,我试了一下,好象>=5的都可以。但是我的malloc(4)怎么就不行呢?  
  to   yoci  
  和上面一样,为什么malloc(4*sizeof(char))就不行呢?Top

18 楼wuchuncai(1234567)回复于 2001-01-02 10:18:00 得分 1

//我一直这样用  
  char   *string;  
  string=new   char[NUMBER];  
  .....  
  delete   []string;Top

19 楼yoci(阿呸)回复于 2001-01-02 11:34:00 得分 2

假如说4不行而>=5都可以的话,很可能是在使用时越界了。Top

20 楼acute(毛头)(食堂帅哥)回复于 2001-01-02 15:08:00 得分 0

是这样的,我要存4个ASCII字符。用了malloc(4)不行。  
  而当我想存2个ASCII时,用了malloc(2),free()没问题。Top

21 楼acute(毛头)(食堂帅哥)回复于 2001-01-02 15:21:00 得分 0

错了错了,现在已经是2001/1/2了,所以上面应该是1个ascii字符用了malloc(2)没问题。  
  刚才试了一下,好象如果存n个字符,需要malloc(n+1),这是为什么呢?  
   
  感谢各位朋友的帮助,现在已经接近给分的边缘了,只需继续说明以上问题即可。  
  Top

22 楼adrianx(蓝色心情)回复于 2001-01-02 15:24:00 得分 0

回复人:acute(2001-1-2   15:08:00)     得0分    
  是这样的,我要存4个ASCII字符。用了malloc(4)不行。  
  而当我想存2个ASCII时,用了malloc(2),free()没问题。    
  你出了什么问题?Top

23 楼killjapan05(ff)回复于 2001-01-02 16:52:00 得分 12

看:  
  http://www.csdn.net/expert/topicview.asp?id=45164Top

24 楼hooligan(风)回复于 2001-01-02 17:39:00 得分 1

Adrianx:如果您的机器没问题,您就有问题,或者Microsoft有问题?  
  Top

25 楼Sam_Yang(Sam)回复于 2001-01-02 18:46:00 得分 1

当然是使用free()了Top

26 楼newx(Royale with Cheese)回复于 2001-01-02 19:17:00 得分 10

哎呀,poor   guy(girl).  
  malloc/new   分配内存时在32bit   OS上是以4byte对齐的。你分2byte   (malloc(2))实际上是分了4bytes,而你再用(malloc(4)),实际上也是分了4bytes.  
  事实上你两种情况都越界了,但malloc(2)是没出问题,但malloc(4)就出问题了。  
   
  我奇怪一定有人不明白为什么free()不需要传入内存尺寸呢?即,  
          int*   pi   =   malloc(2);  
          int*   pj   =   malloc(32);  
  为什么不是这样调用free呢:  
          free(pi,   2);  
          free(pj,   32);  
  那是因为,OS在分配内存时如malloc(2)时一方面是把传入的尺寸以4取整,同时还把的申请的尺寸纪录在了返回内存块的后面某个偏移的地方,再在前后都加上一定格式的头尾,作为“无人区”,当有其他程序改写或读到这些地方是就会引起AV(access   violation).  
  所以当内存越界时(比如往实际分配的4bytes中写入5bytes),数据会覆盖内存块尾部的tag,导致系统试图去释放一块错误尺寸的内存块,内存子系统就会引起AV。  
  Top

27 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:01:00 得分 1

老哥:在MSDN中free()根本就没有第二个参数,你这样free(pi,2)能编译吗?Top

28 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:04:00 得分 1

to   acute:我要存2个字符用malloc(2)可以呀!,我用如下代码:  
  char   *p=(char*)malloc(2);  
  strcpy(p,"kk");没有问题呀!  
  Top

29 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:05:00 得分 1

不过怪了:我一用free(p)就出现错误!,我也搞不懂!,请大虾指点一下。Top

30 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:20:00 得分 1

我用以下却可以:  
  char   *p=(char*)malloc(2);//对了,如果此时用int   k=strlen(p)返回6,而不是2  
  free(p);  
  Top

31 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:32:00 得分 1

真是见鬼了,我用以下代码也出错:  
  char   *p=new   char[2];  
  strcpy(p,"kk");  
  delete   p;或delete[]   p;  
  我只要在内存分配后一但使用再用free()或delete就出错,怪也!  
  Top

32 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 09:10:00 得分 0

刚才拜读了killjapan05介绍的http://www.csdn.net/expert/topicview.asp?id=45164   ,十分感谢。  
  同时也拜读了newx的回答,也有收获。  
  但我对他们所说的4bytes的内存分配方式有点疑惑。如果内存是以4取整,我调用malloc(2)时应该实际分配4bytes大小的内存。例如我存"kk",会存入四位字符'k','k','\0',''。也就是说并没有越界,调用free应该没错的啊。在这里再次请教newx.  
  但如果说在字符串后一定要有一个'\0'做结尾标志倒可以理解,这样,每长度为n的字符串,做内存分配的时候需n+1的分配长度。  
  Top

33 楼wuchuncai(1234567)回复于 2001-01-03 09:15:00 得分 10

我看了前面的一些问题。  
  其实"kk"占3个BYTE,"kkkk"占5个BYTE,字符串最后有一个结束符。  
  strcpy(p,"kk");其实已过界,window有一定的容错能力,free就出错,运气好,free可能还不会出错,但这样用,你的程序不会稳定的。  
  strlen(p),分配内存后,p中是一些乱码,其值会是一些随机值。  
  Top

34 楼wuchuncai(1234567)回复于 2001-01-03 09:18:00 得分 1

该给分了Top

35 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 09:18:00 得分 0

问题初步解决,只期待newx的补充,然后就开始给分了!Top

36 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 09:33:00 得分 0

算了,开始给分!Top

37 楼eyeblue(李洋)回复于 2001-01-03 10:06:00 得分 0

其实问题在于你对内存的使用上,当你用strcpy(p,"kk");时,实际上p="kk/0",共三个字节  
  而你的p只申请了两个字节,这样你事实上破坏了p所指向的内存块,你free时C识别错误,当然要错了!  
  解决办法就是申请内存时大一点(1就行了),我一般在这种情况下就用字符数组char[128]  
  不需要malloc和free,只有在你需要多份不固定大小的内存时,才有必要用malloc和freeTop

38 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 11:09:00 得分 0

我说老大,我都给完分了,你才来答,这不是亏了吗?Top

相关问题

  • wmm在吗?不知道你的信誉分被扣没有啊?
  • 不知道我的信誉分怎么才能回来?
  • 信誉分
  • 信誉分
  • 我的信誉分被扣了3分,有谁知道哪里能挣信誉分的?
  • 如何知道对已分配的内存空间的大小!
  • 分配内存???
  • 有谁知道那里可以下载 LEI? 赠送200分,本人将信誉
  • 还我信誉分!!!!!!!!!!
  • 总信誉分:66 ?????????????

关键词

  • .net
  • 内存
  • 字符
  • malloc
  • 分配
  • free
  • 越界
  • kk
  • 出错
  • 调用

得分解答快速导航

  • 帖主:acute
  • Rechard_G
  • Virtual
  • xiner
  • jadedrip
  • prefix
  • sxbyl
  • mmmyyyaaa
  • horris
  • No9
  • gameboy999
  • gameboy999
  • yoci
  • wuchuncai
  • yoci
  • killjapan05
  • hooligan
  • Sam_Yang
  • newx
  • vcmfc
  • vcmfc
  • vcmfc
  • vcmfc
  • vcmfc
  • wuchuncai
  • wuchuncai

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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