Haskell 指针是按值传递的吗?
Are Haskell Pointers Pass by Value?
我构造了一个f :: Ptr Int -> IO (Int)
类型的函数。
当我传递 f
一些指针 p
,然后尝试 free p
,我得到一个核心转储。
我的结论是Haskell通过引用传递指针并在函数返回值后自动删除它们!
问题:当f
被传递p
时,它是按值还是按引用? Haskell 是否在函数 returns 之前删除了 p
?
您不释放指针,而是释放内存,特别是 malloc(和 co.)分配的内存。如果您释放一个指向非 malloc 分配内存的指针,它将失败。如果释放指向已释放的 malloc 分配内存的指针,它也会失败。
When f is passed p, does it do so by value or by reference?
通常 Haskell 中的值是装箱的,除非您专门使用未装箱的类型。他们通常也很懒惰,所以你得到的是一个盒子里面的一个 thunk。我想这符合引用传递的条件。也就是说,这与您的问题完全无关。如果您只是按 value1.
传递未装箱的严格数值,指针的行为不会有任何不同
Does Haskell delete p by the time the function returns?
绝对不是。 Haskell 不会在任何 Ptr
上自动调用 free
。在没有垃圾收集 2 的情况下,它甚至无法知道何时可以安全地调用给定指针上的 free
。
1关于你的问题。
2 现在,当然 Haskell 是 垃圾收集器,但这不适用于那些值你可以 Ptr
s 到。
我构造了一个f :: Ptr Int -> IO (Int)
类型的函数。
当我传递 f
一些指针 p
,然后尝试 free p
,我得到一个核心转储。
我的结论是Haskell通过引用传递指针并在函数返回值后自动删除它们!
问题:当f
被传递p
时,它是按值还是按引用? Haskell 是否在函数 returns 之前删除了 p
?
您不释放指针,而是释放内存,特别是 malloc(和 co.)分配的内存。如果您释放一个指向非 malloc 分配内存的指针,它将失败。如果释放指向已释放的 malloc 分配内存的指针,它也会失败。
When f is passed p, does it do so by value or by reference?
通常 Haskell 中的值是装箱的,除非您专门使用未装箱的类型。他们通常也很懒惰,所以你得到的是一个盒子里面的一个 thunk。我想这符合引用传递的条件。也就是说,这与您的问题完全无关。如果您只是按 value1.
传递未装箱的严格数值,指针的行为不会有任何不同Does Haskell delete p by the time the function returns?
绝对不是。 Haskell 不会在任何 Ptr
上自动调用 free
。在没有垃圾收集 2 的情况下,它甚至无法知道何时可以安全地调用给定指针上的 free
。
1关于你的问题。
2 现在,当然 Haskell 是 垃圾收集器,但这不适用于那些值你可以 Ptr
s 到。