问题描述
我在这里简化了我的代码。当我不取消分配POINTER时,代码中有内存泄漏,这是合乎逻辑的。但是,问题是我无法取消分配指针。无效化还会导致内存泄漏。
PROGRAM pointer_allocation_deallocation
USE,INTRINSIC :: IEEE_arithmetic,ONLY: IEEE_selected_real_kind
INTEGER,ParaMETER :: pReal = IEEE_selected_real_kind(15,307)
INTEGER :: istat
INTEGER(pReal),DIMENSION(:,:),ALLOCATABLE,TARGET :: trgt1
INTEGER(pReal),POINTER :: ptr1
DO i = 1,1000000
ALLOCATE(ptr1(100,100),STAT=istat)
WRITE(*,*) 'istat1 = ',istat
ALLOCATE(trgt1(10000,10000),STAT=istat)
WRITE(*,*) 'istat2 = ',istat
ptr1 => trgt1
DEALLOCATE(trgt1,*) 'istat3 = ',istat
! DEALLOCATE(ptr1,STAT=istat)
! WRITE(*,*) 'istat4 = ',istat
ENDDO
ENDPROGRAM pointer_allocation_deallocation
解决方法
您使用语句ptr1 => trgt1
创建了内存泄漏,因为无论如何您都无法访问ptr1
先前指向的内存。您应该在此赋值语句之前取消分配ptr1
。