一个憎学家 发表于 2024-11-15 10:06:51

Fortran中内存释放的问题

帖主现在使用的.for源代码较为老旧,其中使用的大量的全局变量和77中未定义的变量,即implicit real*8(a-h,o-z)。
目前将该.for文件写成了动态库供调用,但在实际使用中需要在c语言连续调用该动态库中的函数,内存没有释放导致计算结果出错。由于封装成了dll使得stop命令无法使用且
源代码.for中未定义的变量实在太多,无法用dellocate把每一个都释放,请问是否有解决方案?

fcode 发表于 2024-11-15 14:04:23

implicit real*8(a-h,o-z)
这种只是隐式定义,并不是没有定义。更没有释放一说。

只有 allocatable 动态分配的变量需要写代码释放。
常规定义的变量,当生命周期结束时,系统会自动释放。
不同位置的变量,其生命周期也不同。比如函数(子程序)的局部变量,当函数(子程序)返回时,生命周期就结束了。

而全局变量(请注意你正确理解了全局变量的含义),事实上 Fortran 并没有全局变量的说法,你说的可能是 common 区的变量,它们的生命周期会持续直到整个程序结束。

即便对于 allocatable 动态分配的变量,内存没有释放,一般也不会导致程序计算出错,顶多是内存占用比较大而已。

要把一个 Fortran 代码编译成DLL供给其他程序调用,需要注意很多事情:
包括但不限于:
[*]一次性使用的 Fortran 过程,变成可能多次被调用的过程,一些变量需要第二次调用时,再次初始化。
[*]一些Open了但没有Close的文件,需要补全Close语句,以便第二次使用时正确的打开。
[*]一些动态分配的变量,第二次分配前需要手动先释放。

一个憎学家 发表于 2024-11-20 09:32:41

fcode 发表于 2024-11-15 14:04
implicit real*8(a-h,o-z)
这种只是隐式定义,并不是没有定义。更没有释放一说。



非常感谢解答,实际原因也查出来了,调用的多个子程序中出现了大量的save命令,导致在二次或者多次调用中出现问题

一个憎学家 发表于 2024-11-20 09:58:25

关于上述问题现在暂时让C那边不要连续调用该动态库,若要多次调用,在每次调用动态库后卸载该库。

fcode 发表于 2024-11-21 09:04:47

嗯,程序规模不是特别大的话,可以考虑做一些完善,把save的变量放在一个结构里。提供一个重新初始化的函数接口。
页: [1]
查看完整版本: Fortran中内存释放的问题