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
相关产品推荐
相关产品推荐

