Lisp/ANSI Common Lisp のその先/User Control of GC
表示
Common Lisp の仕様書ではガーベージコレクション(Garbage Collection)についてはほんの少ししか触れられていません。 GC はユーザーが GC について気にせずにすむように、伝統的にブラックボックスとして扱われてきました。しかし、ガーベージコレクションやメモリ管理についてほんの少し操作を出来た方が便利なときもあります。ほとんど全ての Common Lisp の実装では GC
というガーベージコレクションのプロセスを始める関数があります。 GC
は非常に標準的なものですが、そのほかの特徴、例えば弱いポインタ、弱いハッシュ、オブジェクトの完結については一応あるにはしても、標準的なインターフェイスを持っているとは言いがたいです。ここでは互換性レイヤの trivial-garbage を標準的なインターフェイスの提供のために使用していきます。
オブジェクトの完結
[編集]GC がオブジェクトを回収するとき、その空間はただ除去されます。しかし、いくつかの状況では、ガーベージコレクターがデータを回収するときに処理が行われるのは役に立ちます。オブジェクトの完結(クラスの完結とは混同しないでください)はそのような処理の調整を可能にします。
例えば、あなたが外部メモリの配分をしているときにオブジェクトの完結を使いたくなるかもしれません。(メモリはガーベージコレクタのコントロール下にはありません。)オブジェクトの完結はそのようなメモリをガーベージコレクタのコントロール下に置くものです。
(defun get-foreign-array (size) ...
(tg:finalize ...))
ここでは Lisp オブジェクトにある外部ポインタを包み込み、オブジェクトの完結のための処理をセットします。オブジェクトの完結の処理はメモリを解放し、メモリのリークを取り除きます。