SBCL provides additional garbage collection functionality not
specified by ANSI. Weak pointers allow references to objects to be
maintained without keeping them from being garbage collected, and
“finalization” hooks are available to cause code to be executed when
an object has been garbage collected. Additionally users can specify
their own cleanup actions to be executed with garbage collection. See
make-hash-table for information on weak hash tables.
dont-saveis true, the finalizer will be cancelled when
save-lisp-and-dieis called: this is useful for finalizers deallocating system memory, which might otherwise be called with addresses from the old image.
In a multithreaded environment
functionmay be called in any thread. In both single and multithreaded environments
functionmay be called in any dynamic scope: consequences are unspecified if
functionis not fully re-entrant.
functionare handled and cause a
warningto be signalled in whichever thread the
functionwas called in.
Examples:;;; good (assumes RELEASE-HANDLE is re-entrant) (let* ((handle (get-handle)) (object (make-object handle))) (finalize object (lambda () (release-handle handle))) object);;; bad, finalizer refers to object being finalized, causing ;;; it to be retained indefinitely (let* ((handle (get-handle)) (object (make-object handle))) (finalize object (lambda () (release-handle (object-handle object)))));;; bad, not re-entrant (defvar *rec* nil)(defun oops () (when *rec* (error "recursive OOPS")) (let ((*rec* t)) (gc))) ; or just cons enough to cause one(progn (finalize "oops" #'oops) (oops)) ; causes GC and re-entry to #'oops due to the finalizer ; -> ERROR, caught, WARNING signalled