withArray 与 newArray

发布于 2024-12-08 04:31:04 字数 433 浏览 0 评论 0原文

在Haskell FFI中,用withArraynewArray分配的数组有什么本质区别?我在 c 中有一个函数可以与 newArray 一起使用,但与 withArray 一起使用会出现段错误。工作代码看起来有点像这样:

a <- newArray items
fficall a
free a

段错误的代码看起来像这样:

withArray items fficall

当 ffi 进入 blas 函数时,段错误就会发生。由于我不允许显示 c 代码,所以问题是,“请向我展示一个示例 c 函数,该函数也会在 withArray 中出现段错误,但在 newArray 中不会出现段错误”代码>."

In the Haskell FFI, what is the essential difference between arrays allocated with withArray and newArray? I have function in c that works with newArray but segfaults with withArray. The working code looks bit like this:

a <- newArray items
fficall a
free a

The code that segfaults looks like this:

withArray items fficall

The segfault happens up when the ffi enters a blas function. Since I'm not allowed to show the c-code, the question is, "please show me an example c-function that also segfaults with withArray but not with newArray."

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

所谓喜欢 2024-12-15 04:31:04

据我所知,newArray最终调用malloc来进行分配,而withArray调用allocaArray,这最终出现在 newAlignedPinnedByteArray# 中。

也许您的函数依赖于由 malloc 分配的内存,例如尝试 reallocfree 它?

From what I can see, newArray ends up calling malloc to do the allocation, while withArray calls allocaArray, which ends up in newAlignedPinnedByteArray#.

Perhaps your function is relying on the memory being allocated by malloc, for example by attempting to realloc or free it?

苍风燃霜 2024-12-15 04:31:04

看起来 newArray 使用 mallocArray 在堆上分配数组(需要显式释放),但 withArray 分配数组使用 allocaArray 在堆栈上(假设 alloca 的行为方式与 C 中的行为方式相同),当调用函数返回时,它将被回收。您的列表可能太大,导致(鼓声)堆栈溢出。

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

It looks like newArray allocates the array on the heap using mallocArray (which will need to be free'd explicitly), but withArray allocates the array on the stack using allocaArray (assuming alloca behaves the way it does in C), which will be reclaimed when the calling function returns. It is possible that your list is so large that it has caused a (drum roll) Stack Overflow.

Edit: Hmm, maybe not, it looks like allocaArray allocates a pinned array in the heap, using the haskell memory manager instead of the C heap.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文