Redhat下gcc 8.3.1调用strtod128函数出现内存泄漏如何解决?
gcc 8.3.1(Redhat环境)调用
strtod128内存泄漏问题说明及解决方案 这个是Redhat平台搭载gcc 8.3.1版本时的已知共性问题,已有大量开发者反馈过相同现象,根因和解决方案如下:
问题根因
Redhat为gcc 8.3.1配套发布的glibc版本中,strtod128首次调用时会初始化区域设置相关的缓存块,默认不会在进程运行周期内主动释放:
- 如果仅调用一次或少数几次,valgrind等内存检测工具会标记为仍可达的内存泄漏,不会出现内存持续上涨,对业务无实际影响
- 如果在循环逻辑中高频反复调用,会触发重复初始化逻辑,导致内存占用持续升高,才属于需要处理的泄漏问题
解决方法
- 临时规避:如果暂时无法升级系统组件,可将
strtod128的首次调用放到进程全局初始化阶段执行,整个进程生命周期内仅触发一次缓存初始化,即可抑制内存持续增长的问题 - 永久修复:
- 升级gcc到9.4及以上版本,同时升级系统glibc到2.28及以上版本,该版本已官方修复128位浮点数转换函数的内存泄漏缺陷
- 若必须保留gcc 8.3.1版本,可安装Redhat官方针对glibc发布的对应修复补丁,安装完成后重新编译业务代码即可生效
验证方式
可通过valgrind运行测试代码验证修复效果,测试代码示例:
#include <stdlib.h> #include <stdio.h> #include <quadmath.h> int main() { const char *test_str = "987.654e3"; char *end_ptr; __float128 convert_res = strtod128(test_str, &end_ptr); printf("转换结果:%.6Lf\n", (long double)convert_res); return 0; }
编译命令:gcc test.c -o strtod128_test -lquadmath
检测命令:valgrind --leak-check=full ./strtod128_test
修复完成后valgrind的输出中不会再出现和strtod128相关的泄漏记录。
内容的提问来源于stack exchange,提问作者juliet
相关产品推荐
相关产品推荐

