モジュールで宣言され、サブルーチン内で割り当ておよび初期化された配列の割り当て解除に関する Fortran 90 コードで問題が発生しています。私のプログラム内では、 のようなモジュールで一連の配列を宣言していますreal*8, dimension(:), allocatable :: test
。次に、初期化サブルーチンでuse
、モジュールを で変数を割り当て、
allocate(test(8))
で初期化しtest = 0.d0
ます。
この後print*, test
、適切な出力を取得できます: 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0
. さらに、 を呼び出すと、allocated(test)
が返されます.TRUE.
。それにもかかわらず、何かがうまくいかない。への呼び出しの直後に、 へallocate()
の呼び出しがsizeof(test)
返さ0
れ、 への呼び出しが次のエラーをdeallocate(test)
スローします。
lib-4422 : UNRECOVERABLE library error
A DEALLOCATE statement argument points to a portion of the
original allocation.
Original size in bytes for the argument is 512
Current size in bytes for the argument is 0
Segmentation fault
これはすべて、エラーなしでこれらの配列を使用した大きなコード内で発生します。メモリ リークを探しているときに、プログラムの最後でメモリの割り当てを解除しようとしたときだけ、問題に気付きました。上記のことだけを行う単純なプログラムを作成しようとしました (つまり、モジュールで宣言し、サブルーチンで割り当てと初期化を行い、同じサブルーチン内で配列を出力して割り当てを解除します)。ただし、この単純なコードは正しく機能し、エラーなしで実行されます。したがって、より大きなコードのコンテキスト内でこれが誤動作する原因となる可能性があるものについて、私は非常に混乱しています。さらに、より大きなコード内で宣言行をモジュールからサブルーチンに移動すると、すべてが適切に実行されます。
アドバイスをいただければ幸いです。前もって感謝します、
〜BCL