2.3 例題(1)

  10.例題2-10 動的記憶域の解放(free)の例
 以下に示すのは、動的記憶域の解放の例(リストセルの削除関数)です。

 この関数では、消去すべきセルを指すポインタはptrとしています。この関数の実行後、ptrで指されていた領域はリスト構造からは外れ、どこからも参照されなくなります。しかしながら、これは動的記憶域でありますので、全体のプログラムの実行が終らない限り、この領域は確保されたままになります。

<問題>:
ポインタ消去後、これを解放するには、どのようにすれば良いでしょうか?
(a)プログラムリスト

void delete_list(struct ulist *ptr, int data)
{
   struct ulist *qtr;

   while (ptr != NULL) {
      if (ptr->key < data) {
          break;
      }
      qtr = ptr;
      ptr = ptr->next;
  }
  if (ptr != NULL) {      /* delete */
      qtr->next = ptr->next;
  }
}

(b)ヒント
以下の様に、free()を用いて、ptrで指されている領域を開放すればよい。
void delete_list(struct ulist *ptr, int data)
{
  struct ulist *qtr;

  while (ptr != NULL) {
     if (ptr->key < data) {
         break;
     }
     qtr = ptr;
     ptr = ptr->next;
  }
  if (ptr != NULL) {      /* delete */
     qtr->next = ptr->next;
     free(ptr);          /* free memory */
   }
}