On Thu, Jul 03, 2003 at 01:40:46AM -0400, Derek Elkins wrote: > On Thu, 3 Jul 2003 11:34:08 +0800 > [EMAIL PROTECTED] wrote: > > > If a C function returns a (void*), let's say: > > > > data MyObj = MyObj > > > > foreign import ccall "static myobj_ffi.h new_obj" newMyObject :: IO > > (Ptr MyObj) > > > > ptr <- newMyObject > > > > should I free the ptr afterwards or not? > > Assuming that it should be freed even in C and nothing else is managing > it then I believe the answer is yes. You can use a finalizer > to do it.
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. > > If I have another imported C function: > > > > foreign import ccall "static myobj_ffi.h print_obj" printMyObject :: > > Ptr MyObj -> IO () > > > > Can I safely assume the C function print_obj(void *) always get the > > same pointer even if I call (printMyObject ptr) multiple times? > > What other pointer would it pass? The same Haskell ptr. I wonder if they'll ever change after creation. My question is, if Ptr is equivalent to a raw void* pointer in C, and pointers created in foreign language (which is later passed to Haskell as Ptr) has to be freed in the foreign language, then can I safely assume that Ptr isn't affected by Haskell's GC cycle? And what the real difference between Ptr and StablePtr? Regards, .paul. _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe
