1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

C语言中free函数的使用详解

free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下



free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。

 注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

 看一个程序

#include <stdio.h>  #include <stdlib.h>    int main()  {    char * name = NULL;    free(name);    free(name);    free(name);        printf("no problem11111111\n");      name = (char *) malloc(10);    if(name)    {      printf("allocate successful\n");    }    else    {      printf("allocate failed\n");    }      free(name);    free(name);        printf("no problem2222222\n");      return 0;  }

这个程序正好验证了上面的注意事项。

为了避免出现这个错误,自己写了一个函数:

void myfree(void ** point)  {    if(*point != NULL)    {      free(*point);      *point = NULL;    }  }      这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。  将这个函数应用到刚才的程序中就是:
#include <stdio.h>  #include <stdlib.h>      void myfree(void ** point)  {    if(*point != NULL)    {      free(*point);      *point = NULL;    }  }      int main()  {    char * name = NULL;        myfree((void**)&name);    myfree((void**)&name);    myfree((void**)&name);        printf("no problem11111111\n");      name = (char *) malloc(10);    if(name)    {      printf("allocate successful\n");      printf("地址为: %p\n",name);      }    else    {      printf("allocate failed\n");    }      myfree((void**)&name);    myfree((void**)&name);        printf("no problem2222222\n");      return 0;  }

 可以发现程序已经没有错误。

但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。

其实我们可以用带参数的宏定义来简化代码,宏定义如下:

#define FREE(p) myfree((void **)&p)

 应用宏定义后的完整代码:

#include <stdio.h>  #include <stdlib.h>      #define FREE(p) myfree((void **)&p)      void myfree(void ** point)  {    if(*point != NULL)    {      free(*point);      *point = NULL;    }  }      int main()  {    char * name = NULL;        FREE(name);    FREE(name);    FREE(name);        printf("no problem11111111\n");      name = (char *) malloc(10);    if(name)    {      printf("allocate successful\n");      printf("地址为: %p\n",name);      }    else    {      printf("allocate failed\n");    }      FREE(name);    FREE(name);        printf("no problem2222222\n");      return 0;  }

原文链接:https://www.jb51.net/article/114244.htm



还需要注意的是free的参数必须要么是NULL,要么是一个先前从malloc、calloc、或realloc返回的值。 也就是说,free要释放内存的时候,其内存块的信息是在malloc产生的,free的时候需要用到这个信息。 使用malloc和free的时候,一定好注意,不要对分配的指针赋值操作了,复制后,free找不到原来的指针,必然会报错。也就是说,malloc和free是成对出现,free的时候指针必须是malloc过的。

微信扫码关注

更新实时通知

作者:xiao 分类:软件笔记 浏览: