Мой случай довольно прост: у меня есть приложение на C++ и библиотека Haskell, и мне просто нужно экспортировать из Haskell функцию, которая вернет C-строку.
Проблема в том, что строка C изначально является String
, и чтобы получить из нее строку C, мне нужно выделить память, которая должна быть явно освобождена (Haskell free
или finalizerFree
, как документация для newCString
говорит).
Какой хороший способ справиться с этим? В частности, у меня есть несколько соображений:
В идеале я хотел бы каким-то образом позволить сборщику мусора во время выполнения Haskell справиться с этим, но я не уверен, как он может узнать, когда и когда память все еще нужна сторонней стороне. Является ли это возможным?
Если нет, могу ли я просто вызвать C free
или хранилище CString
поддерживается средой выполнения Haskell? если нет, я полагаю, что мне придется экспортировать Haskell free
и вызывать его с внешней стороны, верно?
CString
— это просто псевдоним для голого указателя. Haskell не будет управлять своей памятью за вас. Вы можете создать ForeignPtr, если хотите, но для этого требуется некоторая забота. Каждый раз, когда вы используете указатель, он должен полностью содержаться вwithForeignPtr
звонок. - person Rufflewind   schedule 23.01.2015