Mein Fall ist ziemlich einfach: Ich habe eine C ++ - Anwendung und eine Haskell-Bibliothek, und ich muss nur eine Funktion aus Haskell exportieren, die eine C-Zeichenfolge zurückgeben würde.
Das Problem ist, dass die C-Zeichenfolge ursprünglich ein String
ist, und um eine C-Zeichenfolge daraus zu erhalten, muss ich Speicher zuweisen, der explizit freigegeben werden muss (Haskells free
oder finalizerFree
, als Dokumentation für newCString
sagt).
Was ist ein guter Weg, damit umzugehen? Speziell habe ich ein paar Überlegungen:
Idealerweise möchte ich den Haskell-Laufzeit-GC dazu bringen, das zu handhaben, aber ich bin mir nicht sicher, wie es möglicherweise wissen könnte, wann und wenn die fremde Seite den Speicher noch nicht benötigt. Ist es möglich?
Wenn nicht, kann ich einfach Cs free
aufrufen oder ist der CString
Speicher von der Haskell-Laufzeitumgebung verwaltet? wenn nicht, nehme ich an, dass ich Haskells free
auch exportieren muss, und rufe es von der ausländischen Seite an, richtig?
Sie müssen die Zeichenkette wieder freigeben: Wie Sie sagen, kann Haskells GC nicht wissen, ob das auf der fremden Seite noch benötigt wird.
Haskells free
entspricht genau C's free
. Sie können entweder von der Seite, die Sie bevorzugen, anrufen.
Ich habe nicht überprüft, ob dies durch den Haskell-Bericht + FFI-Nachtrag vorgeschrieben ist, aber ich denke schon.
Tags und Links haskell ghc memory-management ffi