gpt4 book ai didi

memory-leaks - 如何检查之前是否运行过子程序?

转载 作者:行者123 更新时间:2023-12-04 04:35:02 25 4
gpt4 key购买 nike

我目前有一个使用 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

我的模块使用了 finterp图书馆。它为两个值 D 和 E 插入一个 3D 网格数据集。我不得不重写这部分代码来修复内存泄漏,我想修复 As 的位置, Bs , 和 Cs被分配。他们不需要 SAVE 属性;它是我使用的较旧的网格插值实现遗留下来的。但是,如果我删除它,那么根据我的理解,我无法检查 As分配以查看之前是否运行过子例程。

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

有没有办法以不会导致内存泄漏的方式检查“首次运行”条件?

最佳答案

Fortran 中的可分配数组不可能发生内存泄漏。未保存的可分配局部变量在退出过程时被释放。得救的保留下来,但不能无限制地增长。您只能分配有限数量的局部可分配变量,然后占用一些内存,但它们不会不受控制地增长。

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

关于memory-leaks - 如何检查之前是否运行过子程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59548063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com