Fortran Coder

查看: 17110|回复: 6
打印 上一主题 下一主题

[指针] Fortran内存泄露?

[复制链接]

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
跳转到指定楼层
楼主
发表于 2017-3-21 09:24:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位一个困惑已久的问题,Fortran有没有内存泄露的问题呢?比如一个子程序中的动态数组,如果退出子程序的时候没有deallocate,会有什么样的后果呢?目前没看出有什么问题,但是如果没有deallocate的空间太大,会不会发生问题呢?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

沙发
发表于 2017-3-21 10:30:10 | 只看该作者
去stackoverflow上面随便找找就有好多现成回答呀!
Automatic array deallocation in Fortran - Stack Overflow
http://stackoverflow.com/questio ... location-in-fortran
memory leaks - Does deallocating a Fortran derived type automatically deallocate member arrays and pointers as well? - Stack Overflow
http://stackoverflow.com/questio ... ocate-member-arrays

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
板凳
发表于 2017-3-21 10:34:05 | 只看该作者
子程序中的动态数组,如果没有save属性(默认没有),退出子程序会自动释放。你可以用这个代码验证。
[Fortran] 纯文本查看 复制代码
program test
  do k=1,10
    call sub 
  end do
  pause
end program test
  
subroutine sub
  implicit none
  integer,save::i=1
  integer(4),allocatable:: a(:,:,:)
  
  allocate(a(1024,1024,1024/4)) ! 1G内存
  a=i
  write(*,*) a(1,1,1)
  i=i+1
end subroutine
  

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2017-3-21 12:41:12 | 只看该作者
子程序里 allocatable 的数组会自动释放,但是 pointer 不会。

所以如果大量运用指针,内存泄漏是可能的。(但并不是说就不要用指针了,毕竟它还是很有用处的)

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
5#
发表于 2017-3-21 14:29:23 | 只看该作者
integer(4),save,allocatable:: a(:,:,:)
三楼的程序,如果没有对动态数组定义SAVE属性,退出的时候就释放了,如果定义了下次就不能再调用动态数组了,拙见

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
6#
发表于 2017-3-21 14:46:02 | 只看该作者
vvt 发表于 2017-3-21 12:41
子程序里 allocatable 的数组会自动释放,但是 pointer 不会。

所以如果大量运用指针,内存泄漏是可能的。 ...

领教了,做了一下测试确实如此,以前不用指针,不知道在什么时候用,所有的数据都用动态数据来搞定的,班主可以指点一二,在什么情况下使用指针比较好

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
7#
 楼主| 发表于 2017-3-27 09:49:04 | 只看该作者
谢谢各位!这回明白了。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 15:10

Powered by Tencent X3.4

© 2013-2024 Tencent

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