我构建了一个f :: Ptr Int -> IO (Int)
类型的函数。
当我通过f
某个指针p
,然后尝试free p
时,我会获得核心转储。
我的结论是Haskell通过引用传递指针并在从函数返回值后自动删除它们!
问题:f
传递p
时,是按值还是按引用进行的? Haskell在函数返回时是否删除p
?
答案 0 :(得分:4)
你没有自由指针,你释放内存,特别是malloc(和co。) - 分配内存。如果释放指向malloc分配的内存以外的指针,它将失败。如果释放指向已释放的malloc分配内存的指针,它也会失败。
当f通过p时,它是通过值还是通过引用来实现的?
通常将Haskell中的值装箱,除非您专门使用未装箱的类型。他们通常也很懒,所以你得到的是一个thunk里面的盒子。我认为这有资格作为参考传递。也就是说,这与你的问题无关。如果您只是通过值 1 传递未装箱的严格数值,指针就不会有任何不同的行为。
Haskell在函数返回时是否删除p?
绝对不是。 Haskell不会在任何free
上自动调用Ptr
。在没有垃圾收集 2 的情况下,它甚至无法知道何时在给定指针上调用free
是安全的。
1 关于你的问题。
2 现在,当然,Haskell 是垃圾收集,但这并不适用于您可以Ptr
到的值