メモリー管理命令

メモリー管理命令を次の表に示します。

表 59. メモリー管理命令
命令 従来型の構文 自由形式構文
記憶域の割り振り ALLOC (記憶域の割り振り) %ALLOC (記憶域の割り振り)
記憶域の解放 DEALLOC (記憶域の解放)
記憶域の再割り振り REALLOC (新しい長さでの記憶域の再割り振り) %REALLOC (記憶域の再割り振り)
変数のアドレスの入手 %ADDR (変数のアドレスの検索)
プロシージャーのアドレスの入手 %PADDR (プロシージャー・アドレスの検索)

ALLOC 命令では、動的記憶域を割り振り、結果フィールド・ポインターを、 その記憶域を指し示すように設定します。 この記憶域は初期化されません。

REALLOC 命令は、結果フィールド・ポインターによって指し示されている 動的記憶域の長さを変更します。 新しい記憶域は、割り振られると、古い記憶域の値に初期化されます。 新しいサイズが古いサイズより小さい場合、データが切り捨てられます。 新しいサイズが古いサイズより大きい場合は、コピーされたデータの後の 記憶域は初期化されません。 古い記憶域は解放されます。 結果フィールド・ポインターは、新しい記憶域を指し示すように設定 されます。

DEALLOC 命令では、結果フィールド・ポインターが設定される 動的記憶域を解放します。 操作拡張 (N) が指定されている場合、ポインターは再割り振りが正常に 行われた後、*NULL に設定されます。

記憶域は、活動化グループが終了すると暗黙に解放されます。 LR をオンに設定すると、モジュールによって割り振られた 動的記憶域は解放されませんが、動的記憶域を指し示すポインターは失われます。

動的記憶域の使用を誤ると、問題が発生する原因となります。 以下の例は、 それを回避するための手順を示したものです。

D Fld1         S                   25A    BASED(Ptr1)
D Fld2         S                    5A    BASED(Ptr2)
D Ptr1         S                     *
D Ptr2         S                     *
 ....
C                 ALLOC     25               Ptr1
C                 DEALLOC                    Ptr1
 * この時点以降、Fld1 にはアクセスすることはできません。基底ポインター
 * Ptr1 が、割り振られた記憶域を指さなくなっているからです。
C                 CALL      'SOMEPGM'

 * 'SOMEPGM' への直前の呼び出し中に、いくつかの記憶割り振りが
 * 行われている可能性があります。この場合、次の割り当てを行うことは
 * 非常に危険です。これは、25 バイトの記憶域が
 * 'a' によって埋め込まれるためです。その記憶域が現在何に使用されているかを
 * 知ることができなくなります。
C                 EVAL      Fld1 = *ALL'a'

以下は、さらに深刻な状況です。