Das Verständnis, wann ein Zeiger referenziert wird, ist nicht trivial. Soweit ich weiß, gibt es keine Möglichkeit zu erfüllen, was Sie fordern, nämlich informieren Sie den GC, dass ein Zeiger nicht mehr erreichbar ist. Im besten Fall kann man einen GC-Zyklus auslösen, aber es gibt keine festen Garantien.
Von Ihrer Beschreibung würden Sie wahrscheinlich lieber einen Verweis-Zählmechanismus anstelle von Garbage Collection bevorzugen. Insbesondere bei komplexem reinem Code ist es jedoch schwierig, die Punkte zu identifizieren, an denen der Zähler inkrementiert oder dekrementiert werden sollte. In einem Zustand oder einer IO-basierten Monade, in der solche Nebenwirkungen richtig sequenziert werden, wäre w.r.t. der Rest der Berechnung.
Wenn Sie nicht wirklich Referenzzählung über "Eins" hinaus benötigen, verwendet eine irgendwie übliche Redewendung eine with
-Style-Funktion für die Behandlung der Zuordnung und Freigabe. Das kann ein bisschen schwierig zu handhaben sein.
Zum Beispiel eine triviale Implementierung
-- very simplified code
withMyResource :: (ResourcePtr -> IO r) -> IO r
withMyResource action = do
p <- allocResourcePtr
result <- action p
deallocResourcePtr p
return result
Dies kann dann dazu verwendet werden könnte, wie
withResource $ \ptr -> do
use ptr
Beachten Sie, dass dies nicht ganz sicher ist, da könnte man den Zeiger zurückgeben, es Live machen nach seiner Aufhebung
ptr <- withResource return
use ptr -- dangerous!
Eine ordnungsgemäße Zeiger-Behandlung routi ne sollte funktionieren wie die ST
Monade und ihre getaggten STRef
s, die so entworfen sind, um zu verhindern, dass Zeiger ihrem beabsichtigten Umfang entgehen (wie oben getan). Dies nutzt Rang-2-Typen aus, ist aber effektiv.
Noch kann man mit der naiven with
Routine leben, und seien Sie vorsichtig, Zeiger nicht entkommen zu lassen.
Ein weiteres Problem mit der Sicherheit wird dadurch verursacht, dass action
Ausnahmen auslösen kann. (Dies kann unter Verwendung von bracket
-ähnlichen Routinen aus der Bibliothek gehandhabt werden).
[Dieser Blogbeitrag] (http://www.tweag.io/posts/2017-11-29-linearine-jvm.html) spricht über dieses Problem. Es ist eine gute Zusammenfassung des gegenwärtigen Stands der Technik für diese Art von Dingen. – Alec