【问题标题】:Memory leak from pointers in Fortran [closed]Fortran中指针的内存泄漏[关闭]
【发布时间】:2020-10-21 17:58:40
【问题描述】:

我在这里简化了我的代码。当我不 DEALLOCATE POINTER 时,代码中存在内存泄漏,这是合乎逻辑的。但是,问题是我不能 DEALLOCATE 指针。无效化也会导致内存泄漏。

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), DIMENSION(:,:), 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, STAT=istat)
  WRITE(*,*) 'istat3 = ', istat

  ! DEALLOCATE(ptr1, STAT=istat)
  ! WRITE(*,*) 'istat4 = ', istat
ENDDO

ENDPROGRAM pointer_allocation_deallocation

【问题讨论】:

  • Fortran 的一个很好的一般规则是不要使用指针,使用可分配对象,因为它们的危险性要小得多。你真正想做什么?很可能有一种“更 Fortran”的方式来做这件事。

标签: pointers memory-leaks fortran


【解决方案1】:

您使用语句ptr1 => trgt1 创建了内存泄漏,因为无论如何您都无法访问ptr1 先前指向的内存。你应该在这个赋值语句之前释放ptr1

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2011-07-09
    • 2013-10-31
    • 2015-12-15
    相关资源
    最近更新 更多