关于野指针也就是进行了内存free后,其指针变量指向的内存空间已经free掉了,但是指针变量其值并没有释放,可能造成
二次释放的导致程序崩溃。
考虑如下的程序
我们有必要画出他的内存四区图如下:
实际上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);
-
- 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);
-
- }