當我通過任gfortran和Valgrind的或ifort和Intel檢查運行下面的代碼檢測到所述第一時間的步驟set
被稱爲一個對象內存泄漏。第二次似乎沒有導致任何內存泄漏。這是爲什麼?與派生類型指針的內存泄漏
module mymod
implicit none
type mytype
integer, pointer :: intArray(:) => null()
contains
procedure :: set
end type mytype
contains
subroutine set(this, intArray)
class(mytype), intent(inout) :: this
integer, intent(in) :: intArray(:)
integer n
n = size(intArray)
nullify(this%intArray)
allocate(this%intArray(n)) !line 20
this%intArray = intArray
end subroutine set
end module mymod
program main
use mymod !line 28
implicit none
type(mytype) :: myvar
call myvar%set((/1,2,3/)) !line 33
print *, myvar%intArray
call myvar%set((/9,8,7,6,5/))
print *, myvar%intArray
end program main
Valgrind的報告以下的內存泄漏:
==6669== 12 bytes in 1 blocks are definitely lost in loss record 1 of 2
==6669== at 0x402BB7A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6669== by 0x804886A: __mymod_MOD_set (main.f90:20)
==6669== by 0x8048988: MAIN__ (main.f90:33)
==6669== by 0x8048ADC: main (main.f90:28)
行號,請參見代碼中的註釋。