1.4 An example of dynamic memory allocation

In the previous example our defined interface function get-cursor-position used the function allocate-foreign-object to allocate memory for an instance of a POINT structure. This memory is now reserved, with a pointer to its location bound to the variable location . More detailed information on pointers is available in FLI Pointers. To free the memory associated with the foreign object requires the use of the function free-foreign-object.

(fli:free-foreign-object location)

There are other methods for dealing with the question of memory management. The following example defines a Lisp function that returns the x and y coordinates of the cursor without permanently tying up memory for structures that are only used once.

(defun current-cursor-position ()
  (fli:with-dynamic-foreign-objects ()
    (let ((lppoint (fli:allocate-dynamic-foreign-object 
                    :pointer-type 'lppoint)))
      (if (get-cursor-position lppoint)
        (values t (fli:foreign-slot-value lppoint 'x)
                  (fli:foreign-slot-value lppoint 'y))
        (values nil 0 0)))))

On calling current-cursor-position the following happens:

  1. The macro with-dynamic-foreign-objects is called, which ensures that the lifetime of any allocated objects is within the scope of the code specified in its body.
  2. The function allocate-dynamic-foreign-object is called to create an instance of the relevant data structure required to get the cursor position. Refer to it using the lppoint pointer.
  3. The previously defined foreign function get-cursor-position is called with lppoint .
  4. Provided the call to GetCursorPos was successful the function foreign-slot-value is called twice, once to return the value in the x slot and again to return the value in the y slot. If the call was unsuccessful then 0 0 nil is returned.

LispWorks Foreign Language Interface User Guide and Reference Manual - 27 Mar 2005