ポインタが参照されなくなったときの理解は簡単ではありません。 私が知る限り、要求するものを実行する方法はありません。つまり、ポインタに到達できなくなったことをGCに通知してください。せいぜい、GCサイクルを引き起こすことはできますが、厳しい保証はありません。
あなたの説明から、おそらくガベージコレクションの代わりに参照カウントメカニズムが好まれます。しかし、複雑な純粋なコードでは、カウンターをインクリメントまたはデクリメントするポイントを特定することは困難です。ステートまたはIOベースのモナドでは、そのような副作用が適切に順序付けされている方が簡単です。残りの計算。
「1」を超えて参照カウントを行う必要がない場合は、何らかの共通のイディオムが割り当てと割り当て解除を処理するためにwith
スタイル関数を使用しています。 これは、正しく処理するのが少し難しい場合があります。例えば
、些細な実装では、これはその後、1ライブそれを作る、ポインタを返す場合がありますので、これは、完全に安全ではないことを
withResource $ \ptr -> do
use ptr
ノートとして使用することができます
-- very simplified code
withMyResource :: (ResourcePtr -> IO r) -> IO r
withMyResource action = do
p <- allocResourcePtr
result <- action p
deallocResourcePtr p
return result
可能性がありその割り振り解除後に
ptr <- withResource return
use ptr -- dangerous!
適切にポインタ処理ルーチンneはST
モナドとそのタグ付きSTRef
のように動作するはずです。これはポインタが意図したスコープをエスケープしないように設計されています。これはランク2の型を悪用しますが、効果的です。
でも、ナイーブなwith
ルーチンで生きていて、ポインタをエスケープしないように注意してください。
もう1つ安全でない問題は、action
が例外をスローすることによって発生します。 (これは、ライブラリのbracket
のようなルーチンを使用して処理できます)。
出典
2017-12-29 21:30:01
chi
[このブログの記事](http://www.tweag.io/posts/2017-11-29-linear-jvm.html)では、この問題について説明しています。これは、このようなことのための現状の現状を要約したものです。 – Alec