У меня возникают проблемы, когда я передаю часть массива производного типа, который имеет выделяемый компонент.Кажется, что возможны утечки памяти (к сожалению, valgrind еще не доступен для Mac 10.14 / Mojave, поэтому я просто использовал длинный цикл 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 Кб, а с gfortran достигает 30 Мб!).
- Последняя процедура не решает проблему.
- Проблема исчезает, если размещаемый элемент "col" заменяется явным массивом (скажем, col (4)) или если версия #Используется B.
- Проблема также возникает с выделяемым символьным компонентом.
- Если я напечатаю «a» в подпрограмме «do_nothing», обе версии дают правильный результат.
Есть ли у кого-нибудь понимание этого вопроса?Конечно, я могу спроектировать вызываемые подпрограммы, передав массив Ind (do_nothing (row, Ind)), но это было бы несколько жаль.