ヒープ記憶域の問題

図 54 は、ヒープ記憶域の誤用に関連して起こる可能性のある問題を示しています。

図 54. ヒープ記憶域の誤用
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
 *-----------------------------------------------------------------*
 * ヒープ記憶域の誤用                                              *
 *-----------------------------------------------------------------*
D Fld1            S             25A    BASED(Ptr1)
D Ptr1            S               *

 /FREE
    Ptr1 = %ALLOC(25);
    DEALLOC Ptr1;
 
  // この時点以降は、基底ポインター Ptr1 は割り振られた記憶域を
  // 指さなくなるので、Fld1 にアクセスすることはできません。
 
    SomePgm();
 
  // 'SomePgm' への以前の呼び出し時に、複数の記憶域の割り振りが行なわれた
  // 可能性があります。
  // いずれにしても、記憶域の 25 バイトに 'a' が埋め込まれているため、
  // 以下の割り振りを行なうのは非常に危険です。
  // この記憶域が現在何に使用されているのかを知ることはできません。
 
    Fld1 = *ALL'a';
 /END-FREE

同様に、以下のような場合にもエラーが発生する可能性があります。