double free就是程序分配一块内存之后,经过使用将这块内存释放,但并没有将指向这块内存的所有指针抹零或回收,并在其他部分再次将指向同一块内存单元的指针交给内存分配器去进行释放操作。
经常看到类似 if (p) free(p); 的写法,目的是为了防止double free, 但是防止double free的关键不是在释放内存前判断指针是不是为空。
请看以下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
str = (char *)malloc(100);
free(str);
if (str)
{
free(str);
}
return 0;
}
这段代码在第二次释放内存前进行了判断,但是运行中还是会出现double free。原因在于free()函数只会回收指针所指的内存空间,但是在回收后不会把str置为NULL,所以在这里用if判断并没有意义。
那么要怎么样才能防止double free呢?查看free()函数说明:
| |
相关函数 | malloc,calloc,realloc,brk |
表头文件 | #include<stdlib.h> |
定义函数 | void free(void *ptr); |
函数说明 | 参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。若参数ptr为NULL,则free()不会有任何作用。 |
注意这句:若参数ptr为NULL,则free()不会有任何作用。这样就简单了,只要每次在free()后把指针置为NULL就可以了。
在函数中释放内存的话,切忌以下写法:
#include <stdio.h>
#include <stdlib.h>
void clear(char *str)
{
free(str);
str = NULL;
}
int main()
{
char *str;
str = (char *)malloc(100);
clear(str);
return 0;
}