問題タブ [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.
java - Java のガベージ コレクション
私が修正しているスライドでは、次のように述べています。
ライブ オブジェクトは、各オブジェクトへの参照の数を維持するか、ルートから参照のチェーンを追跡することによって識別できます。
参照カウントはコストがかかります。参照が変更されるたびにアクションが必要であり、循環構造を見つけることはできませんが、スペースを段階的に再利用できます。
トレースには、スペースを再利用する必要がある場合にのみ、ライブ オブジェクトを識別することが含まれます。一般的なアクセスから、通常はメモリが不足している場合にのみ、GC が実行される時間にコストを移動します。
参照カウントが高価である理由の原則は理解していますが、「循環構造を検出しないが、スペースを段階的に再利用できる」ものを理解していません。意味。誰か私を少し助けてくれませんか?
ありがとう
debugging - 参照が残っている場合でも、クラスインスタンスを破棄できますか?
デバッグ上の理由から、参照として残っているクラスインスタンスを破棄したいと思います。それは可能ですか?これが本番コードになることは決してないので、エレガントで安定している必要はありません。
明確にするために:
それは可能ですか?1つの方法はIUnknown::Release
、手動で参照数を減らすために呼び出すことですが、どのくらいの頻度で呼び出す必要がありますか?
delphi - 範囲外になると、動的配列は自動的に割り当て解除されますか?
この例では
配列が破壊されているか、メモリがリークしていますか?
objective-c - Cocoa での参照カウント
私が読んでいる「ココアデザインパターン」の本によると、保持機能は次のようなものを使用して実装されていると思います:
例が示すように、すべての参照オブジェクトは同じ self メンバーを持ちます。それはどのように起こりますか?たぶん私はselfの意味を理解していません-C++で「これ」のようなものだと思います。
代入演算子 (A=B) だけを使用すると、ポインター (自己) がコピーされますか? 「copywithzone」を使用すると思いますが、それは親戚であり、「自己」メンバーは等しくありません。また、copywithzone は c++ のコピー コンストラクターのようなものだと思います。
私は2つの世界の間で混乱していると思います。
.net - 共有使用カウンターの同期プリミティブ?
次のような Windows (または .NET) 同期プリミティブはありますか。
- 同じ PC 上の複数のプロセスで共有できます。
- 共有リソースに現在依存しているスレッドの数のカウンターを表します。
- プロセスが異常終了すると、OS によって自動的に減分されます。と
- 別のプロセスで待機できますか(カウントがゼロになったときに通知されますか)?
複数のプロセス間でリソースを共有し、最後のプロセスが (正常または異常にかかわらず) 終了したとき、またはリソースの処理が完了したことを宣言したときにリソースを閉じたいと考えています。起動時に何らかのハンドシェークが必要になりますが、それは可能です。興味深い部分は、プロセスが終了するのを待っているところです。
私が知る限り、名前付きセマフォ (初期カウントが大きい) は、最後の要件以外のすべてを満たすことができます。しかし、セマフォはカウントアップではなくカウントダウンします。また、セマフォが最大カウントに達するのを待つ方法がわかりません。
このためのプリミティブが存在しない場合、そのようなものを作成する .NET ライブラリ、またはビルド方法に関する情報はありますか?
(これはHow can I wait until a Windows process, and its subprocesses, have all exited?の可能な実装のためのものです.しかし、その質問には多くの可能なアプローチがありますが、ここでは、同期オブジェクトがタスクを実行できるかどうかを具体的に調べたいと思います.それらは私が思いついた最初のアプローチですが、実際にこれが機能するかどうかについて、ここで何かを学びたいと思っています.)
c++ - std::string の参照カウント
basic_string
(g ++ 4.2.1にバンドルされている)のコードを見ています。コピー コンストラクターは、grab()
関数を使用して文字列のコピーを "取得" します (その参照カウントを増やします)。
これは、2 つの文字列のアロケーターが同じ場合にのみ参照カウントをインクリメントします。これは理にかなっています。ただし、コピー コンストラクターは次のとおりです。
最初に渡されるアロケータ_M_grab()
は、2 番目のアロケータのコピーです。なんで?operator==()
forallocator
が false を返す唯一の方法は、ユーザーがカスタム アロケーターを使用している場合です。しかし、それが本当だとしても、コピーされたアロケータは元のアロケータと同じになると思いますよね? そう:
- なぜアロケーターを比較するのですか?
- アロケータをコピー構築し、コピーをオリジナルと比較するのはなぜですか?
- コピーをオリジナルと比較すると false が返されるユースケースは何ですか?
アップデート
はい、_M_grab()
別の場所で使用されます: 割り当て用です。この場合、渡されるアロケーター_M_grab()
は異なります。罰金。しかし、コピー構築してからコンストラクターのアロケーターを比較する理由はまだないようですstring
。
c++ - 参照カウント オブジェクトと複数のアロケータ
これは、C++ と参照カウント オブジェクト階層を想定した設計上の問題です。私のコードベースの多くのクラスは、共通の基本クラス (ObjectBase) から派生しています。これは、retain() および release() メソッドを実装して、オブジェクト インスタンスの参照カウントを増減します。
オブジェクトのすべてのインスタンスは、多数のユーザー定義可能なメモリ アロケータを使用して、スタックまたはヒープ上に作成できます。オブジェクト インスタンスが release() メソッドで、retainCount が 0 に達したときに自殺する (これを削除する) ためには、インスタンスは、それがどのアロケーターで構築されたかを認識している必要があります。
現時点では、任意のアロケーターを使用してオブジェクト インスタンスにメモリを割り当てています。次に、placement new を呼び出してオブジェクト インスタンスを構築し、オブジェクトで setAllocator() メソッドを呼び出して、作成されたアロケーターを設定しています。オブジェクトがスタック上に構築されている場合、アロケータは NULL に設定され、release() は delete を呼び出しません。このプロセスは非常に冗長で、エラーが発生しやすい可能性があります (メモリ リーク、setAllocator の呼び出しを忘れた場合など)。
ただし、これにより、任意の数のコンストラクター引数をサポートすることが非常に困難になります。
この問題を解決する方法についてのアイデアを探しています。特にほとんどのクラスは共通のベースから派生するため、スマート ポインターに依存せずにカウント オブジェクトを参照できるというアイデアが本当に気に入っています。
ご協力いただきありがとうございます。
フロリアン
objective-c - MacOSでのガベージコレクションと参照カウントの違いは何ですか
MacOSXでのガベージコレクションと参照カウントの違いは何ですか。
ありがとう、よろしく。マハデヴァンS
c++ - 単純な参照カウント: スマート ポインター
スマート ポインターを使用して単純な参照カウントを実装したいと思います。この変数pointer
は、格納されたオブジェクトへのポインタをreference_count
表し、オブジェクトのコピーの総数を表します。
- NULL を使用してオブジェクトを初期化する場合: reference_count = -1 それ以外の場合は reference_count = 1
- ctor と operator をコピー = reference_count をインクリメント
- デストラクタは reference_count をデクリメントし、指定されたオブジェクトへの参照が他にない場合は、その削除を実行します。
これが私のコードです:
これが私のテストコードです。クラスサンプルは2Dポイントと他の2Dポイントへの2つのポインターを保存します。
2D ポイントのリスト:
テストコード:
そのようなソリューションの利点または欠点はどこにありますか? 大量のデータの実行速度、キャスト、継承に関する問題の可能性などについてはどうですか。助けてくれてありがとう。
この例についてもう1 つ質問がありました。そのようなデータ構造に最も適しているのは、どのタイプのスマート ポインター (共有、スコープ) でしょうか。
};
ご協力いただきありがとうございます...
c++ - スマート ポインター、または「より優れた」デストラクタ
このようなデータ構造に最も適しているのは、どのタイプのスマート ポインター (共有、スコープ) ですか...
構造 1:
};
構造 2:
ベクトルを使用して Edge と PointTopo を保存したいと思います。
しかし、デストラクタに問題があるので、参照カウントを使用するかどうかを検討しました。
ポイント p1、p2 は両方のリスト tl1、tl2 に格納されます。tl2 のデストラクタは例外を引き起こし、ポイント p1 と p2 は tl1 デストラクタを使用して既に削除されています。
この例は合成ではありません。nl2 が nl1 のサブセット、たとえば nl1 の凸包を表すと想像してください...
この問題は、参照カウントなしでは解決できないと思います...だから、スマートポインターを使用しようとしています...
ご助力ありがとうございます...