TL; DR: (, C malloc C free) alloca - ForeignPtr, .
A Ptr - . Addr# . : , , C-runtime, C.
, Haskell. C malloc, C free. Haskell free C, , Foreign.Marshal.Alloc.free Haskell.
, . GHC C-, . destroy_array: Lucky , :
foreign import ccall "stdlib.h free" c_free :: Ptr CInt -> IO ()
C , free . main :
main :: IO()
main = do
let numelements = 5
ptr <- c_get_non_freed_array numelements
w0 <- peek $ advancePtr ptr 0
w1 <- peek $ advancePtr ptr 1
w2 <- peek $ advancePtr ptr 2
w3 <- peek $ advancePtr ptr 3
w4 <- peek $ advancePtr ptr 4
print [w0, w1, w2, w3, w4]
c_free ptr
return ()
, , C. . ForeignPtr. Ptr newForeignPtr:
newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
FinalizerPtr (type FinalizerPtr a = FunPtr (Ptr a -> IO ()) - . :
-- v
foreign import ccall unsafe "stdlib.h &free" c_free_ptr :: FinalizerPtr CInt
-- ^
:
makeArray :: Int -> ForeignPtr CInt
makeArray n = c_get_non_freed_array >>= newForeignPtr c_free_ptr
ForeignPtr, withForeignPtr:
main :: IO()
main = do
let numelements = 5
fptr <- makeArray numelements
withForeignPtr fptr $ \ptr -> do
w0 <- peek $ advancePtr ptr 0
w1 <- peek $ advancePtr ptr 1
w2 <- peek $ advancePtr ptr 2
w3 <- peek $ advancePtr ptr 3
w4 <- peek $ advancePtr ptr 4
print [w0, w1, w2, w3, w4]
return ()
Ptr ForeignPtr , . . alloca* , -, , , .
withArrayLen xs $ \n ptr -> do
c_fast_sort n ptr
peekArray n ptr
Foreign.Marshal.* .
: . , .