fortran66のブログ

fortran について書きます。

FINALIZATION

FINAL 属性のサブルーチンは、TYPE 解放のときに自動実行されます。

Fortran2003 では、オブジェクト指向の機能が取り入れられたので、スカラー型の変数も ALLOCATE で動的に確保できるようになりました。ここでは動的に確保されたスカラー構造体 tt 内部に、さらに動的に配列を確保します。この動的配列を tt が解放される時に実行される FINALIZATION 処理で解放するようにしてみます。

実行結果


ここには示しませんが、タスクモニターでプロセスのメモリー使用量を見てみると、確かにメモリーを開放していることがわかります。

ソースコード

MODULE m_test
   IMPLICIT NONE
   
   TYPE :: t_test
     INTEGER, POINTER :: i(:)
   CONTAINS
     PROCEDURE :: calc_test
     PROCEDURE :: alloc_test
     PROCEDURE :: init_test
     FINAL     :: dealloc_test
   END TYPE t_test
 
 CONTAINS 
   SUBROUTINE alloc_test(this, n)
     CLASS (t_test), INTENT(IN) :: this
     INTEGER, INTENT(IN) :: n
     ALLOCATE( this%i(n) )
     RETURN
   END SUBROUTINE alloc_test
     
   SUBROUTINE dealloc_test(this)
     TYPE (t_test), INTENT(IN) :: this
     PRINT *, '=========== deallocated =============='
     DEALLOCATE(this%i)
     RETURN
   END SUBROUTINE dealloc_test
   
   SUBROUTINE init_test(this)
    CLASS (t_test), INTENT(IN) :: this
    INTEGER :: k
    this%i = [(k,  k = 1, SIZE(this%i) )] 
    RETURN
   END SUBROUTINE init_test
   
   INTEGER FUNCTION calc_test(this)
     CLASS (t_test), INTENT(IN) :: this
     calc_test = SUM(this%i)     
     RETURN
   END FUNCTION calc_test
END MODULE m_test

PROGRAM test
  USE m_test
  TYPE (t_test), ALLOCATABLE :: tt
  ALLOCATE(tt)
  CALL tt%alloc_test(10**6)
  CALL tt%init_test()
  PRINT *, tt%calc_test()
 
  PAUSE
  DEALLOCATE(tt)
  PAUSE
 
  STOP
END PROGRAM test