Glynn Clements wrote:
Peter Simons wrote:
When I create a CString with Foreign.C.String.newCString, do
I have to 'free' it after I don't need it anymore? Or is
there some RTS magic taking place?

How about Foreign.Marshal.Utils.new and all those other
newXYZ functions?

Yes. The new* functions allocate the memory with malloc, and you have to free it yourself. OTOH, the with* functions allocate the memory with alloca, and it is freed automatically. [...]

Just to be nitpicking: The FFI does *not* guarantee that Haskell's malloc(Bytes)/realloc(Bytes)/free is the same as C's malloc/realloc/free. So you should not e.g. use C's free for something allocated via Haskell's malloc.

Apart from that, it may help to remember the following "equations":

   alloca = malloc + free (exception-safe!)
   new = malloc + poke
   with = alloca + poke

Depending on your needs, pooled allocation may an option, too:

   http://haskell.org/ghc/docs/latest/html/libraries/base/Foreign.Marshal.Pool.html

In that case, all allocations are belong to a given pool and memory is
deallocated when the pool in question is. Furthermore:

   withPool = newPool + freePool (exception-safe!)

Cheers,
   S.
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to