【发布时间】:2013-05-02 10:00:34
【问题描述】:
我目前正在尝试在 Fortran 中编写一个小子例程,以在我的程序出现错误时释放内存中所有已分配的变量,即加载文件失败或所需文件不存在。此时,必须终止执行,但并非所有可分配对象都必须被分配(这取决于错误出现在代码的哪个位置),因此我无法进行清理以释放所有可分配对象。
我目前的做法如下:
SUBROUTINE Cleanup(A)
REAL(8), ALLOCATABLE, DIMENSION(:) :: A
IF (ALLOCATED(A)) THEN
DEALLOCATE(A)
END IF
END SUBROUTINE
并为每个可分配对象调用“清理”。问题在于,并非我的所有变量都是维度 1。我在其中一些中最多有三个维度。
我一开始想为不同的维度写3个不同的子程序并使用重载,但这似乎不是很优雅。
然后我想到也许我可以传递一个指针而不是实际的参数 A,但我已经用谷歌搜索了,似乎你不能通过指针释放目标变量。
关于如何正确执行此操作的任何想法?
谢谢。
【问题讨论】:
-
执行终止时,您的代码使用的所有资源都会以任何方式自动释放,因此您不必担心显式释放它们。
-
我知道 Fortran 会自动释放内存,但在这种情况下,我正在编写一个从 Labview 调用的 dll,所以这是管理内存的人。当 dll 出现错误时,Labview 突然停止,如果我尝试重新执行,它将显示消息:“数组已分配”并关闭。这意味着内存没有被正确释放。
-
注意:
real(8)不保证为 8 个字节。一种可移植的方式是use ISO_FORTRAN_ENV,real (real64)用于 64 位。