FFI Ptr question

Alastair Reid alastair@reid-hoffmann.net
Thu, 3 Jul 2003 11:26:07 +0100


paul@theV.net wrote:
> > The wierd thing is, I cannot use the the function
> > Foreign.Marshal.Alloc.free to free the ptr. I must
> > use my own C function to do a simple free() call.

Derek Elkins wrote:
> You didn't allocate it with the Foreign library, why would you expect to
> free it with it?  Actually, I'm kind of surprised it doesn't work,
> nevertheless I don't believe that the intent of the Alloc module is to
> free memory allocated by a foreign language, or allocate memory that
> will be freed by a foreign language.  [...]

Foreign.Marshal.Alloc almost certainly uses either the allocator that is 
native to the language used to implement the Haskell runtime system.  This is 
usually C so using the C 'free' function will often work but if your Haskell 
code were translated to Java instead, it would probably be allocated by a 
Java library and should be freed by the same Java library.  

Or Foreign.Marshal.Alloc might be optimized by exploiting the Haskell garbage 
collector in some way and so the memory has to be released in a way that 
informs the Haskell GC.

In general (not just in Haskell's FFI), any time you allocate memory from a 
given memory pool or library, you should free it into the same memory pool/ 
library.  (We tend not to be aware of this rule because most programs have 
just one allocator.)

We could have avoided this problem by defining Foreign.Marshal.Alloc as a 
frontend for malloc/free.  We didn't do so mostly because 
Foreign.Marshal.Alloc is intended to be language independent (i.e., your code 
should still work if interfacing to Java or if your Haskell code is compiled 
to/ interpreted by a Java program) and, in small part, because malloc/free 
implementations are so damn inefficient.

--
Alastair Reid