DEALLOC (記憶域の解放)

自由形式構文 DEALLOC{(EN) } ポインター名
コード 演算項目 1 演算項目 2 結果フィールド 標識
DEALLOC (E/N)     ポインター名 _ ER _

DEALLOC 命令は、動的記憶域の割り振りの直前の 1 つを解放します。 ポインター名 は、動的記憶域割り振り命令 (RPG 内の ALLOC 命令、または他の何らかの動的記憶域割り振りメカニズム) によって直前に設定された値でなければならないポインターです。このポインターは、動的記憶域を単純に指し示すだけのものでは ありません。割り振りの始めに設定されていることも必要です。

このポインターによって指し示されている記憶域は、このプログラムによって、 あるいは活動化グループ内の他のプログラムによって、これ以降の割り振りの ために解放されます。

命令コード拡張 N が指定されている場合、ポインターは再割り振りが正常に 行われた後、*NULL に設定されます。

DEALLOC 例外 (プログラム状況コード 426) を 処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラーが発生した場合、'N' が指定されていても、 結果フィールドのポインターは変更されません。 エラー処理の詳細については、プログラム例外/エラーを 参照してください。

ポインター名 は、基底ポインター・スカラー変数 (独立フィールド、データ構造サブフィールド、テーブル名、または配列要素) でなければなりません。

このポインターがすでに *NULL であれば、実行時にエラーには なりません。

モジュールの RPG メモリー管理命令が、制御仕様書の ALLOC キーワードにより、単一レベル・ヒープ記憶域を使用している場合、 DEALLOC 命令は、単一レベル・ヒープ記憶域へのポインターのみを処理できます。 モジュールの RPG メモリー管理命令が、テラスペース・ヒープ記憶域を使用している場合、 DEALLOC 命令は、単一レベルとテラスペースの両方のヒープ記憶域へのポインターを処理できます。

詳細については、メモリー管理命令を参照してください。

図 1. DEALLOC 命令
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
D*Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
 *
D Ptr1            S               *
D Fld1            S              1A
D BasedFld        S              7A   BASED(Ptr1)

 /FREE
    // 7 bytes of storage are allocated from the heap and
    // Ptr1 is set to point to it
    Ptr1 = %alloc (7);
 
    // The DEALLOC frees the storage.  This storage is now available
    // for allocation by this program or any other program in the
    // activation group.  (Note that the next allocation may or
    // may not get the same storage back).
    dealloc Ptr1;
 
    // Ptr1 still points at the deallocated storage, but this pointer
    // should not be used with its current value.  Any attempt to
    // access BasedFld which is based on Ptr1 is invalid.
    Ptr1 = %addr (Fld1);
 
    // The DEALLOC is not valid because the pointer is set to the
    // address of program storage.  %ERROR is set to return '1',
    // the program status is set to 00426 (%STATUS returns 00426),
    // and the pointer is not changed.
    dealloc(e) Ptr1;
 
    // Allocate and deallocate storage again.  Since operational
    // extender N is specified, Ptr1 has the value *NULL after the
    // DEALLOC.
    Ptr1 = %alloc (7);
    dealloc(n) Ptr1;
 /END-FREE