传递包含可分配组件的派生类型数组的一部分

时间:2018-12-18 19:24:25

标签: oop memory-leaks fortran gfortran derived-types

当我传递具有可分配组件的派生类型数组的一部分时,我遇到了麻烦。似乎发生了(可能)内存泄漏(不幸的是,在Mac 10.14 / mojave上valgrind尚不可用,因此我只是使用了一个长do循环并查看了与top一起使用的内存)。

请考虑以下测试程序,该程序可以在更简单的上下文中重现我的问题:

program test_leak
  implicit none

  type :: vint_t
     integer, allocatable :: col(:)
  end type vint_t

  type(vint_t) :: row(4)
  integer      :: i, Ind(2)=[2,3]

  do i = 1, 4
     allocate(row(i)%col(i))
  end do

  row(1)%col(1) = 11  
  row(2)%col(1) = 21 ; row(2)%col(2) = 22
  row(3)%col(1) = 31 ; row(3)%col(2) = 32 ; row(3)%col(3) = 33
  row(4)%col(1) = 41 ; row(4)%col(2) = 42 ; row(4)%col(3) = 43 ; row(4)%col(4) = 44

  do i = 1, 1000000
     call do_nothing ( row(Ind) ) ! (version #A) with this version and with gfortran: memory grows with iter
     !call do_nothing ( row(2:3) ) ! (version #B) but not with this version

     if (mod(i,10000) == 0) then
        print*,i ; read*
     end if
  end do

contains

  subroutine do_nothing ( a )
    type(vint_t), intent(in) :: a(:)
  end subroutine do_nothing

end program test_leak
  • gfortran(8.2)而不是ifort(19)或nagfor(6.2)都不存在问题(使用nagfor和ifort时,已使用的内存在迭代过程中稳定,大约为400 Kb,而使用gfortran达到大约30 Mb !)。
  • 最后的程序不能解决问题。
  • 如果将可分配成员“ col”替换为显式数组(例如col(4))或使用版本#B,该问题就会消失。
  • 可分配的字符组件也会出现此问题。
  • 如果我在子程序“ do_nothing”中打印“ a”,则两个版本都给出正确的结果。

有人在这个问题上有见识吗?当然,我可以通过传递数组Ind(do_nothing(row,Ind))来设计被调用的子例程,但这有点遗憾。

0 个答案:

没有答案