Fortran Coder

标题: Fortran内存泄露? [打印本页]

作者: andy8496    时间: 2017-3-21 09:24
标题: Fortran内存泄露?
请教各位一个困惑已久的问题,Fortran有没有内存泄露的问题呢?比如一个子程序中的动态数组,如果退出子程序的时候没有deallocate,会有什么样的后果呢?目前没看出有什么问题,但是如果没有deallocate的空间太大,会不会发生问题呢?

作者: pasuka    时间: 2017-3-21 10:30
去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
作者: li913    时间: 2017-3-21 10:34
子程序中的动态数组,如果没有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
  

作者: vvt    时间: 2017-3-21 12:41
子程序里 allocatable 的数组会自动释放,但是 pointer 不会。

所以如果大量运用指针,内存泄漏是可能的。(但并不是说就不要用指针了,毕竟它还是很有用处的)
作者: 大头鼹鼠    时间: 2017-3-21 14:29
integer(4),save,allocatable:: a(:,:,:)
三楼的程序,如果没有对动态数组定义SAVE属性,退出的时候就释放了,如果定义了下次就不能再调用动态数组了,拙见
作者: 大头鼹鼠    时间: 2017-3-21 14:46
vvt 发表于 2017-3-21 12:41
子程序里 allocatable 的数组会自动释放,但是 pointer 不会。

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

领教了,做了一下测试确实如此,以前不用指针,不知道在什么时候用,所有的数据都用动态数据来搞定的,班主可以指点一二,在什么情况下使用指针比较好
作者: andy8496    时间: 2017-3-27 09:49
谢谢各位!这回明白了。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2