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

gfortran调用random_seed触发Valgrind报告仍可访问内存块是否正常?

问题

调用random_seed例程时,Valgrind报告存在仍可访问的内存块。请问这是预期行为、gfortran的Bug,还是我存在疏漏?

示例程序(rng.f90):

program rng
  implicit none

  integer :: n

  call random_seed(size=n)
end program rng

使用gfortran编译(命令:gfortran -o rng rng.f90),gfortran版本为GNU Fortran (GCC) 12.2.1 20220819 (Red Hat 12.2.1-2),运行Valgrind得到如下报告:

==233092== 40 bytes in 1 blocks are still reachable in loss record 1 of 1
==233092==    at 0x484A464: calloc (vg_replace_malloc.c:1328)
==233092==    by 0x4893EF6: _gfortrani_xcalloc (memory.c:78)
==233092==    by 0x4AF0DCE: get_rand_state (random.c:248)
==233092==    by 0x4AF0DCE: get_rand_state (random.c:238)
==233092==    by 0x4AF0DCE: _gfortran_random_seed_i4 (random.c:889)
==233092==    by 0x401168: MAIN__ (in /home/baptiste/dev/misc/f90/rng/rng)
==233092==    by 0x40119F: main (in /home/baptiste/dev/misc/f90/rng/rng)
==233092== 
==233092== LEAK SUMMARY:
==233092==    definitely lost: 0 bytes in 0 blocks
==233092==    indirectly lost: 0 bytes in 0 blocks
==233092==      possibly lost: 0 bytes in 0 blocks
==233092==    still reachable: 40 bytes in 1 blocks
==233092==         suppressed: 0 bytes in 0 blocks
==233092== 
回答

这是预期行为,既不是gfortran的Bug,也不是你的代码疏漏。

gfortran的random_seed会初始化并维护一个全局的随机数状态结构体,这块内存会被缓存起来,供后续调用随机数相关例程时复用。程序正常退出时,操作系统会自动回收所有进程占用的内存,因此这块"仍可访问"的内存不会造成实际的内存泄漏问题。

Valgrind标记的"still reachable"内存,指的是程序结束时仍有指针指向该内存块,但程序没有主动释放——这种情况在很多运行时库中很常见,属于有意的设计,目的是避免重复分配/释放内存带来的性能开销,尤其是像随机数状态这类可能被频繁访问的资源。

内容的提问来源于stack exchange,提问作者bdem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:46:58