关于C语言double free

本文解析了C/C++中常见的DoubleFree错误原因,解释了free函数仅释放内存而不更改指针值的事实,强调了检查指针状态的重要性,以避免对已释放内存的重复释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一些简单的问题,但是却没有意识到。关于代码中double free的错误。

 

伪代码:

    char * str = NULL;

    str = (char *)malloc(sizeof (char)*num); //申请内存

    free(str);

    在一些循环函数中,我们经常会通过判断str是否为NULL,来判断数据的有效性,那么问题就来了

 

  接上面代码:

 if(str!=NULL)

{

  printf("str is not null   = %s ",str);

 }   

敲黑板:free后的str的值是否为空?

 

答案是肯定不是的。因为free操作只是释放了str指向地址的内存,str的值并没有改变。所以str的值依然存在。只不过现在指向的地址就是一段野内存,不可访问。

如果这个时候对这位置的内存进行访问就会产生断错误,再进行free的话就会double free。

其实是常识,自己搞错了,写一下提醒自己。

### C语言 `double` 类型计算中的精度问题 在C语言中,`double` 数据类型的表示基于IEEE 754标准下的双精度浮点数格式。这种格式提供了大约15至17位有效十进制数字的精度[^1]。然而,在实际应用过程中,由于二进制与十进制之间的转换以及有限存储空间的影响,某些数值无法被精确表示。 对于给定的例子 `-9115536.83208176 + 9115535.47858796` 的运算结果不准确的情况,这主要是因为参与运算的操作数具有较大的绝对值且其小数部分较为复杂,超出了`double`所能提供的确切表示范围。当两个非常接近的大数进行相加或相减操作时,即使它们之间存在微小差异也可能导致显著的结果偏差[^2]。 为了缓解此类问题带来的影响,可以采取以下几种策略: #### 使用更高精度的数据类型 虽然C语言本身并不支持比`double`更高级别的内置浮点数类型,但在特定场景下可以选择第三方库来实现多倍精度甚至任意精度的算术运算。不过需要注意的是,这样做通常会牺牲性能并增加内存消耗。 #### 应用舍入规则 通过调整算法逻辑,在适当位置引入四舍五入或其他形式的小数截处理方式,可以在一定程度上减少累积误差对最终结果造成的影响。例如: ```c #include <math.h> // 对于需要保留固定小数位数的情形可采用如下方法 double round_to_n_decimal_places(double value, int n) { double factor = pow(10, n); return round(value * factor) / factor; } ``` #### 利用辅助类库(如GMP) GNU Multiple Precision Arithmetic Library (GMP) 是一个开源项目,专门用于执行高精度整数、有理数和浮点数运算。借助该库能够有效地规避因硬件层面限制所引发的各种潜在风险。 ```c #include <gmp.h> ... mpz_t a, b, sum; mpz_init_set_d(a, -9115536L); mpz_init_set_d(b, 9115535L); /* Perform addition */ mpz_add(sum, a, b); char* result_str = mpz_get_str(NULL, 10, sum); printf("Result of adding integers part is %s\n", result_str); // For handling fractional parts separately using mpf_class from GMPXX wrapper. mpf_class frac_a("-0.83208176"); mpf_class frac_b("0.47858796"); mpf_class total_fractional(frac_a + frac_b); std::cout << "Total Fraction Part: " << total_fractional.get_d() << std::endl; mpz_clear(a); mpz_clear(b); free(result_str); ``` 尽管上述措施能够在不同程度上改善由`double`引起的精度损失现象,但从本质上讲,只要涉及到计算机内部以二进制编码的形式去近似描述实数,则不可避免地会出现某种程度上的失真情况。因此,在编写涉及严格数值比较的应用程序之前,务必充分考虑这些因素,并设计合理的容错机制[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值