次の例の FREE 文は、ALLOCATE 文によって割り当てられた記憶域ブロックを解放します。
DECLARE TABLE(100) FLOAT BASED; DECLARE P POINTER; . . . ALLOCATE TABLE SET(P); . . . FREE P->TABLE;
次の例の FREE 文は、AREA を開放します。
DECLARE ITEM1 BIN BASED(O1); DECLARE ITEM2 BIN BASED(O2); DECLARE ITEM3 BIN BASED; DECLARE A AREA(64); DECLARE O1 OFFSET(A); DECLARE O2 OFFSET; DECLARE O3 OFFSET; ALLOCATE ITEM1; /* implicitly in area A; implicitly set O1 */ ALLOCATE ITEM2 IN(A); /* explicitly in area A; implicitly set O2 */ ALLOCATE ITEM3 IN(A) SET(O3); /* explicitly in area A; explicitly set O3 */ FREE ITEM1; /* both implicit */ FREE ITEM2 IN(A); /* IN is required */ FREE O3->ITEM3 IN(A); /* Locator and IN required */
説明
FREE 文は、参照によって指定される基底付き変数または制御変数に割り当てられた記憶域のすべてのブロックを解放します。
FREE 文で参照がロケーターで修飾されていない場合、その変数は暗黙的に基底付き変数の宣言から取得したロケーターを使用して修飾されます。宣言にロケーターが指定されていない場合、FREE 文はエラーになります。
領域内で割り当てが解放される場合、IN 句を指定するか、宣言内で領域に関連付けられたオフセット変数で基底付き変数を修飾する必要があります。
参照によって明示的または暗黙的に使用されるロケーター修飾子は、ALLOCATE 文の実行によって割り当てられた記憶域ブロックをポイントする必要があります。ALLOCATE 文によって記憶域が割り当てられなかった基底付き変数または制御変数に対して FREE 文を使用すると、予期しない結果になります。
参照を添え字付きにすることはできません。また、参照で指定する、メンバーではない基底付き変数または制御変数は、記憶域が割り当てられたときに使用されたのと同じサイズ、シェイプ、およびコンポーネントのデータ型である必要があります。
制御変数に割り当てられた記憶域が FREE 文によって解放されると、その変数に対する次に新しい割り当てが利用可能になり、それ以降の参照はその割り当てを参照します。
基底付き変数に割り当てられた記憶域が FREE 文によって解放されると、その記憶域ブロックは参照できなくなります。そのブロックをアドレス指定しているポインターはすべて無効になり、使用できません。この規則に違反すると、予期しない結果になります。