关于野指针也就是进行了内存free后,其指针变量指向的内存空间已经free掉了,但是指针变量其值并没有释放,可能造成
二次释放的导致程序崩溃。
考虑如下的程序
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<string.h>
-
-
#define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}
-
-
-
-
int getstr( char **p/*out*/,int *len/*out*/)
-
{
-
*p = (char *)malloc(4094);
-
strcpy(*p,"testesest");
-
*len = strlen(*p);
-
-
return 0;
-
}
-
-
-
-
-
int main()
-
{
-
char *p = NULL;
-
int len = 0;
-
-
getstr(&p,&len);
-
-
printf("%s %d\n",p,len);
-
-
if(p!=NULL)
-
{
-
free(p); //释放指针p指向的内存空间,但是指针变量本身的值还存在
-
printf("%p\n",p);//打印出来
-
}
-
-
if(p!=NULL) //条件还是成立因为p变量本身没有改变
-
{
-
free(p);//内存不存在了,再次释放程序崩溃
-
}
-
}
我们有必要画出他的内存四区图如下:
实际上free(p)的时候,只是free了指针p指向的堆栈的内存空间,而指针p的
变量0X25C1010这个值还在,如下:
记住指针p也是需要在栈上开辟空间的,实际上
我们只需要在free(p)后将p=NULL,将指针的值赋予0,那么下次释放的时候加
上p!=NULL即可,我们可以定义一个宏:
#define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}
来完成所有的操作如下:
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<string.h>
-
-
#define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}
-
-
-
-
int getstr( char **p/*out*/,int *len/*out*/)
-
{
-
*p = (char *)malloc(4094);
-
strcpy(*p,"testesest");
-
*len = strlen(*p);
-
-
return 0;
-
}
-
-
-
-
-
int main()
-
{
-
char *p = NULL;
-
int len = 0;
-
-
getstr(&p,&len);
-
-
printf("%s %d\n",p,len);
-
xfree(p); //使用宏
-
xfree(p);
-
-
}