malloc()、malloc64()、および realloc() 関数は、記憶領域のブロックを割り当て、ブロックの開始アドレスを戻します。戻り値は INTEGER や Cray-style の POINTER 変数の設定に使用できます。realloc() は既存の記憶領域ブロックを新しいサイズで再割り当てします。free() は malloc()、malloc64()、または realloc() により割り当てられた記憶領域ブロックの割り当てを解除します。
これらのルーチンは、f95 の組み込み関数として実装されていますが、f77 の外部関数でした。独自のバージョンのものを使う場合を除き、Fortran 95 プログラムの型宣言や EXTERNAL 文で使用すべきではありません。realloc() ルーチンは f95 のみに実装されています。
Fortran 95 規格合致プログラムは、ALLOCATE および DEALLOCATE 文を割り当て可能な配列に使用して、動的メモリー管理を実行しますが、malloc/realloc/free への直接呼び出しは行いません。
従来の FORTRAN 77 プログラムは malloc()/malloc64() を使用して、INTEGER 変数として同じデータ表現を持つ Cray-style の POINTER 変数に値を代入できました。Cray-style の POINTER 変数は f95 に実装され、FORTRAN 77 からの可搬性をサポートします。
malloc() 関数は、次のように呼び出します。
k = malloc( n ) |
|||
n |
INTEGER |
入力 |
記憶領域のバイト数 |
戻り値 |
INTEGER(Cray POINTER) |
出力 |
k>0: k は割り当てられた記憶領域の開始アドレス k=0: エラー |
-m64 を使って、64 ビット環境用にコンパイルした場合は、INTEGER*8 ポインタ値が戻る。次に示す注を参照。 |
この関数は、Fortran 95 では組み込み関数ですが、FORTRAN 77 では外部関数でした。64 ビット環境で動作するようにコンパイルされたプログラムでは、malloc() 関数とその出力を受け取る変数を INTEGER*8 と宣言する必要があります。関数 malloc64(3F) は、プログラムを 32 ビット環境と 64 ビット環境間で可搬性を持たせるために提供された関数です。
k = malloc64( n ) |
|||
n |
INTEGER*8 |
入力 |
記憶領域のバイト数 |
戻り値 |
INTEGER*8 (Cray POINTER) |
出力 |
k>0: k は割り当てられた記憶領域の開始アドレス k=0: エラー |
これらの関数は、記憶領域を割り当て、その領域の開始アドレスを返します。64 ビット環境では、この返されたバイトアドレスは、INTEGER*4 の数値範囲外になる可能性があります。 受け取り側の変数では INTEGER*8 と宣言し、メモリーアドレスが切り捨てられないようにする必要があります。この記憶領域は、初期化できません。 そのため記憶領域が、ある値、特にゼロに事前設定されていることを前提としないでください。
例: malloc() を使用したコード部分
parameter (NX=1000) integer ( p2X, X ) real*4 X(1) … p2X = malloc( NX*4 ) if ( p2X .eq. 0 ) stop 'malloc: 割り当て不可' do 11 i=1,NX 11 X(i) = 0. … end |
前述の例では、 p2X で指定される 4,000 バイトのメモリーを獲得し、この領域を 0 に初期化しています。
realloc() f95 組み込み関数は、次のように呼び出します。
k = realloc(ptr, n ) |
|||
ptr |
INTEGER |
入力 |
既存の記憶領域へのポインタ (前述の malloc() または realloc() 呼び出しからの戻り値)。 |
n |
INTEGER |
入力 |
必要とされるブロックの新しいサイズ。 バイト単位。 |
戻り値 |
INTEGER (Cray POINTER) |
出力 |
k>0: k は割り当てられた新しい記憶領域の開始アドレス k=0: エラー |
-m64 を使って、64 ビット環境用にコンパイルした場合は、INTEGER*8 ポインタ値が戻る。次に示す注を参照。 |
realloc() 関数は ptr によって指定される記憶領域のサイズを n バイトに変更し、ポインタを (移動された可能性のある) 新しいブロックに戻します。記憶領域の中身は新規および古いサイズの最小までには変更されません。
ptr が 0 の場合、realloc() は malloc() と同じ処理を行い、新しく n バイトの記憶領域サイズを割り当てます。
n が 0 で ptr が 0 以外の場合、指定された記憶領域のブロックは将来の割り当てに対して有効にされ、アプリケーションが終了した場合のみ、システムに戻されます。
例: malloc() 、realloc()、および Cray-style POINTER 変数を使用した例を示します。
PARAMETER (nsize=100001) POINTER (p2space,space) REAL*4 space(1) p2space = malloc(4*nsize) if(p2space .eq. 0) STOP 'malloc: 割り当てできません' ... p2space = realloc(p2space, 9*4*nsize) if(p2space .eq. 0) STOP 'realloc: 再割り当てできません' ... CALL free(p2space) ... |
realloc() は f95 のみに実装されています。
サブルーチンは、次のように呼び出します。
call free ( ptr ) |
||
ptr |
Cray POINTER |
入力 |
free は malloc や realloc() により割り当てられた記憶領域の割り当てを解除します。記憶領域はメモリーマネージャーに戻されます。 これでユーザーのプログラムでは使用できなくなります。
例: free():
real x pointer ( ptr, x ) ptr = malloc ( 10000 ) call free ( ptr ) end |