在Haskell FFI中,使用withArray
和newArray
分配的数组之间的本质区别是什么?我在c中的函数与newArray
一起使用,但在withArray
中使用了段错误。工作代码看起来像这样:
a <- newArray items
fficall a
free a
segfaults的代码如下所示:
withArray items fficall
当ffi进入blas函数时,会发生段错误。由于我不允许显示c代码,问题是,“请向我展示一个示例c函数,该函数也与withArray
但不与newArray
进行段错误。”
答案 0 :(得分:3)
从我看到的情况来看,newArray
最终会调用malloc
进行分配,而withArray
调用allocaArray
,最终会在newAlignedPinnedByteArray#
。
也许您的功能依赖于malloc
分配的内存,例如尝试realloc
或free
?
答案 1 :(得分:2)
看起来newArray
使用mallocArray
(需要显式释放)在堆上分配数组,但是withArray
使用{allocaArray
在堆栈上分配数组。 1}}(假设alloca
的行为方式与C)相同,将在调用函数返回时回收。您的列表可能很大,导致(滚动)Stack Overflow。
编辑:嗯,也许不是,看起来allocaArray
使用haskell内存管理器而不是C
堆在堆中分配固定数组。