передача части массива производного типа, который содержит выделяемый компонент - PullRequest
0 голосов
/ 18 декабря 2018

У меня возникают проблемы, когда я передаю часть массива производного типа, который имеет выделяемый компонент.Кажется, что возможны утечки памяти (к сожалению, 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)), но это было бы несколько жаль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...