当我传递具有可分配组件的派生类型数组的一部分时,我遇到了麻烦。似乎发生了(可能)内存泄漏(不幸的是,在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
有人在这个问题上有见识吗?当然,我可以通过传递数组Ind(do_nothing(row,Ind))来设计被调用的子例程,但这有点遗憾。