メモリー管理命令

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

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

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

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

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

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

ヒープ記憶域には、単一レベルとテラスペースの 2 つのタイプがあります。 制御仕様書で ALLOC キーワードを使用して、 メモリー管理命令が使用するヒープ記憶域のタイプを制御できます。

ヒープ記憶域のそれぞれのタイプに、利点と欠点があります。

さまざまなタイプのヒープ記憶域について 詳しくは、「ILE 概念」(>SC41-5606) の記憶域管理に関する章を参照してください。

動的記憶域の使用を誤ると、問題が発生する原因となります。 以下の例は、 それを回避するための手順を示したものです。
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'
以下は、さらに深刻な状況です。