C语⾔中free函数的使⽤详解
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;
}
好了今天就写到这⾥了,希望对你有帮助,如有不正确的地⽅,还请指点。多谢~~
>molloc函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论