Memory leaks 如何检查以前是否运行过子例程?

Memory leaks 如何检查以前是否运行过子例程?,memory-leaks,fortran,Memory Leaks,Fortran,我现在有一个使用2008标准的Fortran程序,它有一个子程序,如果它是子程序的第一次运行,它可以从文件中加载数据。在所有运行中,子例程对数据进行插值并返回两个值,但目标是避免从文件中重新加载相同的数据 最初,我有这样的想法: module myModel_mod use myModelLoader_mod use linear_interpolation_module implicit none contains subroutine myModel(

我现在有一个使用2008标准的Fortran程序,它有一个子程序,如果它是子程序的第一次运行,它可以从文件中加载数据。在所有运行中,子例程对数据进行插值并返回两个值,但目标是避免从文件中重新加载相同的数据

最初,我有这样的想法:

module myModel_mod
    use myModelLoader_mod
    use linear_interpolation_module
    implicit none
    contains
    subroutine myModel(A, B, C, modelFile, D, E)
        real :: A, B, C, D, E
        character(len=*) :: modelFile
        type(linear_interp_3d), save :: F, G
        real, dimension(:), allocatable, save :: As, Bs, Cs
        if (.not. allocated(As)) then
            call loadModel(modelFile, As, Bs, Cs)
            .
            .  (processing of loaded data and creation of F and G occurs here)
            .
        end if
        call F%evaluate(A, B, C, D)
        call G%evaluate(A, B, C, E)
    end subroutine
end module
我的模块利用了这个库。它为两个值D和E插入一个3D网格数据集。我必须重写这部分代码来修复内存泄漏,我想修复
As
Bs
Cs
的剩余分配位置。它们不需要SAVE属性;它是我使用的网格插值的一个较旧的实现遗留下来的。但是,如果我删除它,那么据我所知,我无法检查是否分配了
As
,以查看该子例程之前是否运行过

我曾考虑过创建一个逻辑标志变量,该变量带有SAVE属性,该属性在子例程第一次运行时设置,但我相信这仍然会导致较小的内存泄漏,尽管比我目前拥有的要小得多


有没有一种方法可以检查“首次运行”情况,而不会导致内存泄漏?

在Fortran中使用可分配数组时,内存泄漏是不可能的。未保存的可分配局部变量在退出过程时被释放。保存的文件将被保留,但无法无限增长。您只能分配有限数量的本地可分配变量,这些变量会占用一些内存,但如果没有控制,它们将不会增长


为了回答你的标题问题,我使用保存逻辑变量的方法,如果是关于分配本地或模块数组,我只使用
if(allocated())

你称之为“内存泄漏”是什么?我并没有看到任何被称为“内存泄漏”的可能性。在很多代码中,变量是分配的,并没有被释放。因此,在一次程序执行中多次运行main函数(调用此子例程)会连续分配更多内存,而不会释放内存。这里的分配是在
if
语句的省略部分完成的,这是一组
if
语句,用于从加载的数据中删除冗余项。我建议创建数组模块变量并创建清理子例程。但对于可分配阵列,不可能存在真正的内存泄漏。内存总是可以访问的,你不能无限分配。@VladimirF好吧,我知道如何使用模块变量来实现这一点,但是内存是如何总是可以访问的呢?子例程中定义的变量不是只能从子例程中访问吗?如果它们没有save属性,那么在下一次调用时,它们不是从子例程内部也无法访问吗?未保存的本地可分配数组将根据Fortran 95的规则自动释放。