You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的首次调用放到进程全局初始化阶段执行,整个进程生命周期内仅触发一次缓存初始化,即可抑制内存持续增长的问题
  • 永久修复:
    1. 升级gcc到9.4及以上版本,同时升级系统glibc到2.28及以上版本,该版本已官方修复128位浮点数转换函数的内存泄漏缺陷
    2. 若必须保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:24:06