問題タブ [refcounting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 参照カウントスマートポインタは、参照カウンタのオーバーフローをどのように回避または処理しますか?
単純な参照カウント スマート ポインターの実装では、参照カウンターがオーバーフローする可能性がありました。このオーバーフローは、C++ 標準ライブラリの実装でどのように回避または処理されますか?
c - 同じ参照カウントを持つコンテナーに格納されているオブジェクトを解放しないようにする方法
私は、c で書かれたカスタム プログラミング言語のいくつかの機能に取り組んできました。現在、言語のオブジェクトの参照カウントを行うシステムに取り組んでいます。これは、c では、とりわけ参照カウントを持つ構造体として表されます。
現在割り当てられているすべてのオブジェクトを解放できる機能もあります (すべてのメモリをクリーンアップするためにプログラムを終了する前など)。ここに問題があります。
どうすればうまくいくかを考えていたのですが、いくつか問題がありました。状況を少しスケッチしましょう。
2 つの新しい整数が割り当てられます。どちらも参照カウントが 1 である 1つの
新しいリストが割り当てられ、参照カウントも 1 である
両方の整数がリストに含まれるようになり、
これらのアクションの後に参照カウントが 2 になります。両方の整数が何らかの理由で範囲外になるため、それらの参照カウントはまだリストにあるため 1 に減少します。
これらのオブジェクトの処理が完了したので、関数を実行して追跡対象のすべてのオブジェクトを削除します。ただし、お気づきかもしれませんが、リストとリスト内のオブジェクトの参照カウントは同じ (1) です。これは、どのオブジェクトを最初に解放するかを決定する方法がないことを意味します。
リストの前に整数を解放すると、リストは以前に解放された整数の参照カウントを減らそうとしますが、これは segfault になります。
整数の前にリストが解放されると、整数の参照カウントが 0 にデクリメントされ、整数も自動的に解放されるため、整数を解放するためにそれ以上の手順を実行する必要はありません。それらはもう追跡されていません。
現在、ほとんどの場合は機能するシステムがありますが、上記の例では参照カウントに基づいてオブジェクトを解放しています。最新の最高カウント。これは明らかに、整数の参照カウントが上記の例で表示されているリストよりも多い場合にのみ機能しますが、常にそうであるとは限りません。(整数が範囲外にドロップされていないため、リストよりも参照カウントが多い場合にのみ機能します)
注:私は本当に好きではない方法をすでに1つ見つけました。すべてのオブジェクトにフラグを追加して、コンテナ内にあるため解放できないことを示します。割り当てられたすべてのオブジェクトにメモリのオーバーヘッドが追加され、循環依存があるとオブジェクトが解放されないため、これは好きではありません。もちろん、サイクル検出器でこれを修正できますが、できれば参照カウントのみでこれを行いたいと思います。
上記の手順の具体例を挙げましょう。
もちろん起こるべきことは、100% の確率で、整数が解放される前にリストが解放されるということです。
コンテナーに格納されているオブジェクトがコンテナーの前に解放されないように、既存のすべてのオブジェクトを解放するよりスマートな方法は何でしょうか?