首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于内存free()函数使用有关问题 多谢解答

2013-07-01 
关于内存free()函数使用问题 谢谢解答在看到cpp将到free()函数有两个例子不理解[codec]例1: int main (){

关于内存free()函数使用问题 谢谢解答
在看到cpp将到free()函数有两个例子不理解
[code=c]例1:
 int main ()
  {
     double glad[2000];
     int i
     ...
     for ( i = 0; i < 1000; i++)
         gobble (glad,2000);
         ...
     }

  void gobble (double ar[], int n)
  {
      double * temp = (double *) malloc (n * sizeof (double));
   ...
      /* free (temp);   忘记使用 free() */
  }
假设没有使用free(),当函数终止时,指针temp作为一个自动变量消失了。但他所指向的16000个字节的内存依旧存在,这是为什么啊?
例2:
int main (void)
{
    double *ptd;
    int max;
    int number;
    int i = 0;

    puts ("What is the maximum number of type double entries?");
    scanf ("%d", &max);
    ptd = (double *) malloc (max * sizeof (double));
    if (ptd == NULL)
    {
       puts ("Memory allocation failed, Goodbye");
       exit (EXIT_FAILURE);
    }

// ptd 现在指向有 max 个元素的数组
   此处省略   
   free(ptd);

   return 0;
}
课本上说到程序末尾附近的函数free(),在这个特定例子中,使用free()不是必须的,说因为在程序终止后所有已分配的内存都将自动释放,这又是为何?这个例子和上个例子区别何在啊?我什么时候确定要使用free()或不使用呢?谢谢解答[code] free 内存 malloc
[解决办法]

引用:
在看到cpp将到free()函数有两个例子不理解
[code=c]例1:
 int main ()
  {
     double glad[2000];
     int i
     ...
     for ( i = 0; i < 1000; i++)
         gobble (glad,2000);
         ...
     }

  void gobble (double ar[], int n)
  {
      double * temp = (double *) malloc (n * sizeof (double));
   ...
      /* free (temp);   忘记使用 free() */
  }
假设没有使用free(),当函数终止时,指针temp作为一个自动变量消失了。但他所指向的16000个字节的内存依旧存在,这是为什么啊?
例2:
int main (void)
{
    double *ptd;
    int max;
    int number;
    int i = 0;

    puts ("What is the maximum number of type double entries?");
    scanf ("%d", &max);


    ptd = (double *) malloc (max * sizeof (double));
    if (ptd == NULL)
    {
       puts ("Memory allocation failed, Goodbye");
       exit (EXIT_FAILURE);
    }

// ptd 现在指向有 max 个元素的数组
   此处省略   
   free(ptd);

   return 0;
}
课本上说到程序末尾附近的函数free(),在这个特定例子中,使用free()不是必须的,说因为在程序终止后所有已分配的内存都将自动释放,这又是为何?这个例子和上个例子区别何在啊?我什么时候确定要使用free()或不使用呢?谢谢解答[code]



先说神马事内存:这货就是一个高容量高速存储介质,cpu内存没有足够的存储空间来完全存下你的程序(特别像现在动辄几百MB的玩意儿),它是给cpu做数据临时存放用的,计算时取特定位置的内容到cpu里面,算完了再放到特定的位置。说白了就是给cpu打下手的。它是硬件,供os管理(os5大功能之1)。

既然供os管理,所以你的程序要运行,要需要内存,必须通过os的许可,像dos里面的run命令,linux下的./ 以及各种*alloc函数, 所以你一旦使用了*alloc(查mmu页表,找空闲的内存和空闲的大小),就是获得了一段内存的使用权限(没用使用权一样可以使用,只是你永远无法预料你正在访问的那段没有许可的内存,会被什么程序使用,你的更改会造成什么后果),mmu页表会生成记录,表示从x地址开始多大的空间被使用。free就是从mmu页表消除这条记录。

函数栈空间(程序执行空间)是自动释放(pc寄存器),不要问我为神马,有兴趣去看汇编。而你malloc的区域不会自动给你释放(没用通过free消除使用记录,mmu页表中的信息还在,所以os一直认为那段内存被使用着,实际上你的程序早执行完不知道多久了),除非你显式调用*free(有些情况,比如简单的程序,没free,os会给你擦屁股)








[解决办法]
      free()的调用方式是:void   free(void   *ptr)。是释放由ptr所指的内存,并将它返回给堆,以便这些内存成为再分配时的可用内存。free()函数只能用于以前由动态地址分配的函数。如果调用无效指针很可能毁坏内存管理机制,并且引起系统破坏的。

       free是调用操作系统的函数,将原先分配的内存区域释放。在操作系统中分配内存不是简单的给一个指针,而是在内核中维护每个程序的分配内存表,free则是用指针找到对应分配的表项然后释放。  

释放内存不是丢掉指针。否则的话后患无穷,就是内存泄漏。那么malloc到底做什么?free到底做什么?简单的说,malloc在一个特定的内存区划出一块你利用参数指定的大小的内存块,然后把这块内存的开始地址返回。这要求你用一个指针来接收。否则也会出现内存泄漏。因为这块内存你申请了之后,并没有释放。说到这里补充一句,malloc函数分配的内存空间不会自动释放,需要你操作来完成。需要的操作就是free。那么free做什么呢?就是将指针指定的内存空间释放,如果发现指定的内存空间不是在与malloc匹配的内存空间,free操作就会失败。所以free做的是释放指针指向的用malloc申请的特定的内存空间,而不是指针本身。

        结论:使用方法 对于用malloc分配空间的指针p, 使用过后要这样释放:

        free(p);

        p=NULL;

热点排行