問題タブ [reference-counting]
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++プログラミング言語のX86CPUに、効率的でスレッドセーフな参照カウントシステムをどのように実装しますか?
私は常に、重要な操作がアトミックではなく、使用可能なX86インターロック操作が参照カウントシステムを実装するには不十分であるという問題に遭遇します。
次の記事ではこのトピックについて説明していますが、特別なCPU命令が必要です。
delphi - TInterfacedObjectガベージの子孫が収集されないのはなぜですか?
TInterfacedObjectに基づくクラスがあります。TTreeNodeのDataプロパティに追加します。
私はこのオブジェクトの多くのインスタンスを作成し、それらは参照カウントであるため、それらを解放する必要はないと想定していました。それは便利でしょう。
ただし、これを確認すると、ReportMemoryLeaksOnShutdownをオンにしたところ、結局解放されていないことがわかりました。
これらのオブジェクトは、メインフォームに配置されたフレームに作成されています。メインフォームのFormCloseで、すべてのオブジェクトが解放されるようにツリーノードをクリアします。
何が起こっていますか?
ご協力ありがとうございました!
delphi - Delphi で参照カウント オブジェクトを実装する方法
私は構造のようなグラフを持っています。オブジェクトを従来の Delphi の方法で破棄するタイミングが正確にはわかりません。代わりに、参照カウント オブジェクトのようなものを実装したいと考えています。Free の代わりに object.GetReference や object.Release などを使用し、参照カウントにプライベート変数を使用できることはわかっていますが、他に良い方法はありますか?
ありがとう
c++ - C ++でスマートポインタを実装するための最良の方法は何ですか?
私はさまざまなスマートポインターの実装を評価してきましたが(うわー、そこにはたくさんあります)、それらのほとんどは2つの大まかな分類に分類できるようです。
1)このカテゴリは、参照されるオブジェクトの継承を使用して、参照カウントがあり、通常はup()およびdown()(またはそれらに相当するもの)が実装されているようにします。IE、スマートポインターを使用するには、ポイントしているオブジェクトは、ref実装が提供するクラスから継承する必要があります。
2)このカテゴリは、参照カウントを保持するためにセカンダリオブジェクトを使用します。たとえば、スマートポインターをオブジェクトに直接向ける代わりに、実際にはこのメタデータオブジェクトを指します...参照カウントとup()およびdown()の実装を持っている人(そして通常、ポインターのメカニズムを提供する人)スマートポインタが演算子->()を適切に実装できるように、ポイントされている実際のオブジェクトを取得します。
これで、1には、カウントを参照するすべてのオブジェクトが共通の祖先から継承するように強制されるという欠点があります。これは、ソースコードを制御できないカウントオブジェクトを参照するためにこれを使用できないことを意味します。に。
2には、カウントが別のオブジェクトに格納されているため、既存の参照カウントオブジェクトへのポインタが参照に変換されているという状況が発生した場合、おそらくバグが発生するという問題があります(つまり、カウントが実際のオブジェクトでは、新しい参照がカウントを取得する方法はありません... ref to refコピーの構築または割り当ては、カウントオブジェクトを共有できるため問題ありませんが、ポインタから変換する必要がある場合は、完全にホースで固定されています)..。
さて、私が理解しているように、boost :: shared_pointerはメカニズム2、またはそのようなものを使用しています...とはいえ、私は自分の決心を完全に決めることはできません。私はこれまで本番コードでメカニズム1のみを使用しました...誰かが両方のスタイルの経験がありますか?または、おそらくこれらの両方よりも優れた別の方法がありますか?
c++ - Swig と参照カウントの C++ クラス
私の C++ オブジェクトの多くは、AddRef メソッドと FreeRef メソッドを使用して、再帰カウントを実装しています。FreeRef が参照カウントを 0 に減らすと、オブジェクトは自身を削除します。
参照カウント オブジェクトを返すすべてのメソッドは、参照をインクリメントしません。スマート ポインターは、ポインターを受け取ると単純にカウントをインクリメントし、ポインターを参照しなくなったときにカウントをデクリメントできるため、これにより簡単になります。例えば:
SWIGに、既存のスマートポインタをこれらのオブジェクトに内部的に使用するように指示できるかどうか考えていましたが、それを行う方法がわかりません:(
c++ - 参照カウントポインタのSTLクラス?
これは些細なことですが、私はそれを見つけることができないようです(そのようなクラスが存在しない限り!)
スマートポインタのSTLクラス(またはクラスのセット)とは何ですか?
アップデート
回答ありがとうござい
ます。標準の実装がないことに驚いています。
私はこれを使用することになりました: http: //archive.gamedev.net/reference/articles/article1060.asp
c++ - VC++ 文字列が参照カウントされないのはなぜですか?
STL 標準では、 from std::string を参照カウントする必要はありません。しかし実際には、ほとんどの C++ 実装は参照カウントされたコピー オン ライト文字列を提供し、文字列をプリミティブ型として値で渡すことができます。また、これらの実装 (少なくとも g++) は、アトミック操作を使用して、これらの文字列をロックフリーにし、スレッドセーフにします。
簡単なテストは、コピーオンライトのセマンティクスを示しています。
非定数メンバーが使用された後、2 つのアドレスのみが正確に出力されます。
HP、GCC、Intel コンパイラを使用してこのコードをテストしたところ、同様の結果が得られました。文字列はコピー オン ライト コンテナーとして機能します。
一方、VC++ 2005 では、各文字列が完全にコピーされていることが明確に示されています。
なんで?
私は、VC++6.0 にスレッドセーフではない参照カウントの実装があり、ランダムなプログラム クラッシュを引き起こすバグがあったことを知っています。これが理由ですか?彼らは、それが一般的な慣行であっても、もはや参照カウントを使用することを恐れているだけですか? 問題を修正することよりも、参照カウントをまったく使用しないことを好むのですか?
ありがとう
c++ - shared_ptrを使用するときにサイクルを検出する方法
shared_ptrは、Boostライブラリの参照カウントスマートポインタです。
参照カウントの問題は、サイクルを破棄できないことです。これをC++で解決するにはどうすればよいのでしょうか。
「サイクルを作成しない」、「weak_ptrを使用する」などの提案はしないでください。
編集
サイクルを作成することがわかっている場合は問題がないので、weak_ptrを使用するという提案は好きではありません。また、実行時にshared_ptrsを生成した場合、コンパイル時にサイクルが発生することもわかりません。
だから、私は特にそのような答えを持たないように頼んだので、weak_ptrを使用している答えを自己削除してください...
delphi - オブジェクトの参照カウント
私のコードでは、さまざまな場所で作成された小さなデータ保存クラスを使用しています。メモリリークを回避し、物事を単純化するために、参照カウントを使用したいので、
TFileInfo.Freeへの手動呼び出しをすべて削除しました。残念ながら、Delphiは多くのメモリリークを報告しました。SOで検索すると、これが機能しない理由を説明する次の質問が見つかりました。
TInterfacedObjectガベージの子孫が収集されないのはなぜですか?
そこに回避策が示されていますが、(少なくとも正しく理解できれば)カスタムインターフェイスIFileInfoを作成し、多くのゲッターとセッターを提供する必要があります。これは避けたいものです。
編集私は、create FileInfoオブジェクトを2つの異なる種類のハッシュテーブルに挿入することを追加する必要があります。1つはTBucketListから派生し、もう1つはCodegearフォーラムのハッシュマップ実装です。内部的には両方ともユーザーポインタであるため、状況は他の質問と同じです。
Delphiのオブジェクトに参照カウントを使用させる他の可能性はありますか?
memory-management - 純粋関数型言語が参照カウントを使用しないのはなぜですか?
純粋関数型言語では、データは不変です。参照カウントでは、参照サイクルを作成するには、作成済みのデータを変更する必要があります。純粋に関数型の言語は、サイクルの可能性を気にせずに参照カウントを使用できるようです。そうですね?もしそうなら、なぜ彼らはしないのですか?
多くの場合、参照カウントは GC よりも遅いことは理解していますが、少なくとも一時停止時間は短縮されます。一時停止時間が悪い場合に参照カウントを使用するオプションがあると便利です。