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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

    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" );
       }
    }
      

  9.   

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

  10.   

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

  11.   

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

  12.   

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

  13.   

    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,不会出错了!*/
    上面仅为猜想,如有更好解释,请记得告诉我。
      

  14.   

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

  15.   

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

  16.   

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

  17.   

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

  18.   

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

  19.   

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

  20.   

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

  21.   

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

  22.   

    哎呀,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。
      

  23.   

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

  24.   

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

  25.   

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

  26.   

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

  27.   

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

  28.   

    刚才拜读了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的分配长度。
      

  29.   

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

  30.   

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

  31.   

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