gpt4 book ai didi

haskell - "bracket (mallocBytes n) free"和 "allocaBytes"有什么区别?

转载 作者:行者123 更新时间:2023-12-04 05:23:03 26 4
gpt4 key购买 nike

如果您需要背景,请参阅 here .简而言之,问题是:“bracket (mallocBytes n) free 之间的实际区别是什么?和 allocaBytes来自 Foreign.Marshall.Alloc ”。

通常在 C 中,alloca在堆栈和 malloc 上分配在堆上分配。我不确定 Haskell 中发生了什么,但除了速度之外,我不希望上述方程之间存在差异。如果你点击后台链接,你会知道编译后的代码 bracket (mallocBytes n) free导致“双重释放或损坏”,而 allocaBytes工作正常(在 GHCi 中根本看不到问题,在这两种情况下一切正常)。

到目前为止,我已经花了两天时间进行痛苦的调试,我非常有信心 bracket (mallocBytes n) free不知何故不稳定,其余代码是可靠的。我想知道 bracket (mallocBytes n) free 是怎么回事.

最佳答案

bracket (mallocBytes size) free将使用 C 的 mallocfree , 而 allocaBytes size将使用由 GHC 垃圾收集管理的内存。这本身就是一个巨大的差异,因为 PtrallocaBytes可能被未使用(但已分配)的内存包围:

import Control.Exception
import Control.Monad (forM_)
import Foreign.Marshal.Alloc
import Foreign.Ptr
import Foreign.Storable

-- Write a value at an invalid pointer location
hammer :: Ptr Int -> IO ()
hammer ptr = pokeElemOff ptr (-1) 0 >> putStrLn "hammered"

main :: IO ()
main = do
putStrLn "Hammer time! Alloca!"
forM_ [1..10] $ \n ->
print n >> allocaBytes 10 hammer

putStrLn "Hammer time! Bracket"
forM_ [1..10] $ \n ->
print n >> bracket (mallocBytes 10) free hammer

结果:
Hammer time! Alloca!
1
hammered
2
hammered
3
hammered
4
hammered
5
hammered
6
hammered
7
hammered
8
hammered
9
hammered
10
hammered
Hammer time! Bracket
1
hammered
<program crashes>

如您所见,虽然我们使用了 arr[-1] = 0 , allocaBytes很高兴地忽略了这个错误。但是, free如果您写信给 -1 职位,将会(经常)在您的脸上爆炸.如果另一个分配的内存区域出现内存损坏*,它也会在你的脸上爆炸。

此外,与 allocaBytes ,很可能指针指向已分配内存的某处,而不是指向内存的开头,例如
nursery = malloc(NURSERY_SIZE);

// ...

pointer_for_user = nursery + 180;

// pointer_for_user[-1] = 0 is not as
// much as a problem, since it doesn't yield undefined behaviour

这意味着什么?好吧, allocaBytes不太可能在你的脸上爆炸,但代价是你没有注意到你的 C 代码变体是否会导致内存损坏。更糟糕的是,一旦你写到 allocaBytes 返回的范围之外。 ,您可能会默默地破坏其他 Haskell 值。

但是,我们在这里谈论的是未定义的行为。上面的代码可能会或可能不会在您的系统上崩溃。它也可能在 allocaBytes 中崩溃部分。

如果我是你,我会 trace the malloc and free calls .

* 我曾经在我的程序中间出现“双重使用免费”错误。调试了一切,重写了大部分“坏”例程。不幸的是,错误在调试版本中消失了,但在发布版本中再次出现。原来在 main的前十行,我不小心写信给 b[i - 1]i = 0 .

关于haskell - "bracket (mallocBytes n) free"和 "allocaBytes"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41410805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com