メモリー管理命令を次の表に示します。
命令 | 従来型の構文 | 自由形式構文 |
---|---|---|
記憶域の割り振り | 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'
以下は、さらに深刻な状況です。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.