withArray vs newArray

时间:2011-10-05 02:55:46

标签: c haskell ffi

在Haskell FFI中,使用withArraynewArray分配的数组之间的本质区别是什么?我在c中的函数与newArray一起使用,但在withArray中使用了段错误。工作代码看起来像这样:

a <- newArray items
fficall a
free a

segfaults的代码如下所示:

withArray items fficall

当ffi进入blas函数时,会发生段错误。由于我不允许显示c代码,问题是,“请向我展示一个示例c函数,该函数也与withArray但不与newArray进行段错误。”

2 个答案:

答案 0 :(得分:3)

从我看到的情况来看,newArray最终会调用malloc进行分配,而withArray调用allocaArray,最终会在newAlignedPinnedByteArray#

也许您的功能依赖于malloc分配的内存,例如尝试reallocfree

答案 1 :(得分:2)

看起来newArray使用mallocArray(需要显式释放)在堆上分配数组,但是withArray使用{allocaArray在堆栈上分配数组。 1}}(假设alloca的行为方式与C)相同,将在调用函数返回时回收。您的列表可能很大,导致(滚动)Stack Overflow。

编辑:嗯,也许不是,看起来allocaArray使用haskell内存管理器而不是C堆在堆中分配固定数组。