
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.... 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.