Haskell 初始化期间指针/外部指针的垃圾收集

Haskell 初始化期间指针/外部指针的垃圾收集,haskell,memory,garbage-collection,ghc,Haskell,Memory,Garbage Collection,Ghc,我正在使用Data.ByteString.Internal中的mallocByteString创建一个缓冲区 在写的时候,我可能会意识到我没有分配足够的内存,所以我分配了一个更大的缓冲区并使用它。 这个过程(realloc、copy over、忘记旧的ptr)可能会发生很多次 {-#语言类型应用程序} 进口外国货 进口外国货 进口国外。可储存 将限定数据.ByteString.Internal作为BSI导入 测试::IO() 测试=do 让容量=1024 外国人 poke@Word8 ptr 0

我正在使用
Data.ByteString.Internal
中的
mallocByteString
创建一个缓冲区

在写的时候,我可能会意识到我没有分配足够的内存,所以我分配了一个更大的缓冲区并使用它。 这个过程(realloc、copy over、忘记旧的ptr)可能会发生很多次

{-#语言类型应用程序}
进口外国货
进口外国货
进口国外。可储存
将限定数据.ByteString.Internal作为BSI导入
测试::IO()
测试=do
让容量=1024
外国人
poke@Word8 ptr 0
poke@Word8(ptr`plusPtr`1)1
poke@Word8(ptr`plusPtr`2)2
poke@Word8(ptr`plusPtr`3)3
--等
--哎呀,1024字节是不够的
外国人
BSI.memcpy ptr ptr容量
--拨动ptr',拨动ptr',拨动ptr'
我的问题是:一旦我把东西从
ptr
复制到
ptr'
,旧的
ptr
foreignPtr
会发生什么

即使
withForeignPtr
继续操作仍在执行,它是否可以选择进行垃圾收集? 我需要释放它吗


我担心,如果我必须realloc 10次,我将有9个缓冲区占用不必要的内存。

我已重新构造代码,以便在缓冲区已满时使用foreignptr退出
,然后realloc/copy over:

test2::IO()
test2=do
让容量=1024
外国人
poke@Word8 ptr 0
poke@Word8(ptr`plusPtr`1)1
poke@Word8(ptr`plusPtr`2)2
poke@Word8(ptr`plusPtr`3)3
--等
--哎呀,1024字节是不够的
返回()
外国人
使用foreignPtr foreignPtr$\ptr->
BSI.memcpy ptr ptr容量
poke@Word8(ptr'`plusPtr`容量)0
poke@Word8(ptr'`plusPtr`(容量+1))1
poke@Word8(ptr'`plusPtr`(容量+2))2

我相信,通过这种方式,GC将能够清理旧指针。

我已经重新构造了代码,以便在缓冲区已满时使用foreignptr退出
,然后realloc/copy over:

test2::IO()
test2=do
让容量=1024
外国人
poke@Word8 ptr 0
poke@Word8(ptr`plusPtr`1)1
poke@Word8(ptr`plusPtr`2)2
poke@Word8(ptr`plusPtr`3)3
--等
--哎呀,1024字节是不够的
返回()
外国人
使用foreignPtr foreignPtr$\ptr->
BSI.memcpy ptr ptr容量
poke@Word8(ptr'`plusPtr`容量)0
poke@Word8(ptr'`plusPtr`(容量+1))1
poke@Word8(ptr'`plusPtr`(容量+2))2

我相信,通过这种方式,GC将能够清理旧指针。

我不是这些库的专家,但我认为在您离开
和foreignPtr
之前,foreignPtr不会被忘记。看起来您可以使用
finalizeForeignPtr
强制解除分配。我不是这些库的专家,但是我认为直到你离开
和foreignPtr
时,foreignPtr才被忘记。看起来你可以使用
finalizeForeignPtr
强制解除一个。