メモリ(およびリソースロック)は、プログラムの実行中の確定的なポイントでOSに返されます。プログラムの制御フローだけで、特定のリソースの割り当てを確実に解除できる場所を知るのに十分です。人間のプログラマーがfclose(file)
、プログラムが完了したときにどこに書くべきかを知っているように。
GCは、制御フローが実行されるランタイム中に直接把握することでこれを解決します。しかし、制御フローについての真実の本当のソースはソースです。したがって、理論的にはfree()
、ソース(またはAST)を分析することで、コンパイルの前に呼び出しを挿入する場所を決定できるはずです。
参照カウントはこれを実装するための明らかな方法ですが、ポインターがまだ参照されている(まだスコープ内にある)けれども不要になった状況に遭遇するのは簡単です。これは、ポインタを手動で割り当て解除する責任を、それらのポインタへのスコープ/参照を手動で管理する責任に変換するだけです。
プログラムのソースを読み取ることができるプログラムを作成することが可能であるように思われます。
- プログラムの制御フローのすべての順列を予測する---プログラムのライブ実行を監視するのと同様の精度
- 割り当てられたリソースへのすべての参照を追跡する
- 参照ごとに、参照が絶対に参照解除されないことが保証される最も早いポイントを見つけるために、後続の制御フロー全体をトラバースします。
- その時点で、ソースコードのその行に割り当て解除ステートメントを挿入します
すでにこれを行うものはありますか?RustやC ++スマートポインター/ RAIIは同じものだとは思わない。