关于double free的一点点思考

    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()函数说明:



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;
}


 

   

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值