withArray против newArray - PullRequest
       12

withArray против newArray

3 голосов
/ 05 октября 2011

В Haskell FFI, в чем принципиальная разница между массивами, выделенными с withArray и newArray?У меня есть функция в C, которая работает с newArray, но segfaults с withArray.Рабочий код выглядит примерно так:

a <- newArray items
fficall a
free a

Код segfaults выглядит следующим образом:

withArray items fficall

Сегфолт возникает, когда ffi входит в функцию blas.Поскольку мне не разрешено показывать c-код, вопрос в том, «пожалуйста, покажите мне пример c-функции, которая также работает с withArray, но не с newArray

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Из того, что я вижу, newArray в итоге вызывает malloc для распределения, а withArray вызывает allocaArray, что в итоге newAlignedPinnedByteArray#.

Возможно, ваша функция полагается на память, выделяемую malloc, например, пытаясь realloc или free it?

2 голосов
/ 05 октября 2011

Похоже, newArray выделяет массив в куче, используя mallocArray (который должен быть явно свободен), но withArray выделяет массив в стеке, используя allocaArray (предполагая allocaведет себя так же, как и в C), который будет возвращен после возврата вызывающей функции.Возможно, ваш список настолько велик, что вызвал переполнение стека (барабанная дробь).

Редактировать: Хм, а может и нет, похоже, allocaArray выделяет закрепленный массив в куче, используяМенеджер памяти haskell вместо кучи C.

...