Fortran Coder

查看: 156|回复: 4

[混编] Fortran中内存释放的问题

[复制链接]

17

帖子

6

主题

0

精华

入门

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

2031

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1632 元
贡献
705 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

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

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

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

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

17

帖子

6

主题

0

精华

入门

F 币
74 元
贡献
42 点
 楼主| 发表于 2024-11-20 09:32:41 | 显示全部楼层
fcode 发表于 2024-11-15 14:04
implicit real*8(a-h,o-z)
这种只是隐式定义,并不是没有定义。更没有释放一说。

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

17

帖子

6

主题

0

精华

入门

F 币
74 元
贡献
42 点
 楼主| 发表于 2024-11-20 09:58:25 | 显示全部楼层
关于上述问题现在暂时让C那边不要连续调用该动态库,若要多次调用,在每次调用动态库后卸载该库。

2031

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1632 元
贡献
705 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2024-11-21 09:04:47 | 显示全部楼层
嗯,程序规模不是特别大的话,可以考虑做一些完善,把save的变量放在一个结构里。提供一个重新初始化的函数接口。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-11 10:35

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表