Fortran 如何检查记忆丧失

Fortran 如何检查记忆丧失,fortran,gfortran,Fortran,Gfortran,我将为一个科学项目编写一个(非常)大的代码,其中将使用大量可分配的数组。是否有一个内在的fortran函数或编译器标志,我可以使用它检查所有可分配变量是否已正确释放?我使用的是gfortrangcc,因此gfortran也可以使用AddressSanitizer库来检测内存泄漏。这可以使用-fsanize=address选项启用 然后,输出将类似于valgrind产生的结果: ==26339==ERROR: LeakSanitizer: detected memory leaks Direct

我将为一个科学项目编写一个(非常)大的代码,其中将使用大量可分配的数组。是否有一个内在的fortran函数或编译器标志,我可以使用它检查所有可分配变量是否已正确释放?我使用的是
gfortran

gcc,因此gfortran也可以使用AddressSanitizer库来检测内存泄漏。这可以使用
-fsanize=address
选项启用

然后,输出将类似于
valgrind
产生的结果:

==26339==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 144 byte(s) in 1 object(s) allocated from:
    #0 0x7f46fad68510 in malloc (/usr/lib64/libasan.so.4+0xdc510)
    #1 0x407754 in __sectiontest_MOD_constructor /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:27
    #2 0x403939 in __sectiontest_MOD_demo /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:95
    #3 0x408564 in MAIN__ /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe_prog.f90:5
    #4 0x4085a4 in main /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe_prog.f90:2
    #5 0x7f46f9d8ef89 in __libc_start_main (/lib64/libc.so.6+0x20f89)

Direct leak of 96 byte(s) in 1 object(s) allocated from:
    #0 0x7f46fad68510 in malloc (/usr/lib64/libasan.so.4+0xdc510)
    #1 0x407754 in __sectiontest_MOD_constructor /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:27
    #2 0x403d72 in __sectiontest_MOD_demo /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:95
    #3 0x408564 in MAIN__ /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe_prog.f90:5
    #4 0x4085a4 in main /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe_prog.f90:2
    #5 0x7f46f9d8ef89 in __libc_start_main (/lib64/libc.so.6+0x20f89)

Indirect leak of 144 byte(s) in 1 object(s) allocated from:
    #0 0x7f46fad68510 in malloc (/usr/lib64/libasan.so.4+0xdc510)
    #1 0x405fec in __sectiontest_MOD_section_assign /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:50
    #2 0x408237 in __sectiontest_MOD_constructor /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:30
    #3 0x403d72 in __sectiontest_MOD_demo /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe.f90:95
    #4 0x408564 in MAIN__ /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe_prog.f90:5
    #5 0x4085a4 in main /users/tiziano/work/tests/fortran/cp2k_input_parser/recursive_mwe_alternative/recursive_mwe_prog.f90:2
    #6 0x7f46f9d8ef89 in __libc_start_main (/lib64/libc.so.6+0x20f89)

SUMMARY: AddressSanitizer: 384 byte(s) leaked in 3 allocation(s).

正如前面在注释中所述,内存泄漏不应该发生在可分配项中。另一方面,经验表明可能存在编译器错误,这可能会导致内存泄漏。

您有
分配的
功能,您可以使用该功能检查实体的分配状态,语言标准要求编译器在分配的实体超出范围时处理释放(受
save
d实体的例外情况限制)。编写代码泄漏内存(特别是当代码使用指向可分配数组的指针时)并非不可能,甚至不是非常困难,但通常可以避免。使用
allocatable
数组泄漏内存是不可能的。这就是为什么要首先使用它们的主要原因。您应该只担心
指针
数组,或者如果您知道必须释放一些不再需要的全局数组。@HighPerformanceMark所以释放数组是“可选”的,因为如果您不这样做,编译器会为您做吗?这很好,你可以尝试使用
valgrind
来检测内存泄漏。是的,就是这样。很好。