Haskell Pointers是否超值?

时间:2016-10-21 20:07:43

标签: haskell ffi

我构建了一个f :: Ptr Int -> IO (Int)类型的函数。

当我通过f某个指针p,然后尝试free p时,我会获得核心转储。

我的结论是Haskell通过引用传递指针并在从函数返回值后自动删除它们!

问题f传递p时,是按值还是按引用进行的? Haskell在函数返回时是否删除p

1 个答案:

答案 0 :(得分:4)

你没有自由指针,你释放内存,特别是malloc(和co。) - 分配内存。如果释放指向malloc分配的内存以外的指针,它将失败。如果释放指向已释放的malloc分配内存的指针,它也会失败。

  

当f通过p时,它是通过值还是通过引用来实现的?

通常将Haskell中的值装箱,除非您专门使用未装箱的类型。他们通常也很懒,所以你得到的是一个thunk里面的盒子。我认为这有资格作为参考传递。也就是说,这与你的问题无关。如果您只是通过值 1 传递未装箱的严格数值,指针就不会有任何不同的行为。

  

Haskell在函数返回时是否删除p?

绝对不是。 Haskell不会在任何free上自动调用Ptr。在没有垃圾收集 2 的情况下,它甚至无法知道何时在给定指针上调用free是安全的。

1 关于你的问题。

2 现在,当然,Haskell 垃圾收集,但这并不适用于您可以Ptr到的值