newCString -- to 'free' or not?

Sven Panne Sven.Panne at aedion.de
Sun Sep 26 06:43:38 EDT 2004


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.


More information about the Glasgow-haskell-users mailing list